2016-06-17 7 views
-4

Я хотел бы напечатать результат оболочки, сортируя массив с 1000 элементами. Функция имеет тип void, поэтому я хочу знать, как получить значение «возвращено» из функции (на самом деле не вернулось, фактически результат). Это не мой код до сих пор:Печать функции void на языке C

#include "stdafx.h" 
#include <stdlib.h> 
void shellsort(int v[], int n) 
{ 
    int gap, i, j, temp; 
    for (gap = n/2; gap > 0; gap /= 2) 
     for (i = gap; i < n; i++) 
      for (j = i - gap; j >= 0 && v[j] > v[j + gap]; j -= gap) 
       temp = v[j]; 
    v[j] = v[j + gap]; 
    v[j + gap] = temp; 


} 
int main() 
{ 

    int i; 
    int my_array[1000]; 

    for (i = 0; i < 1000; i++) { 
     my_array[i] = rand(); 
    } 

    shellsort(my_array, 1000); 


    return 0; 
} 
+0

, что вы имеете в виду, «печать функция пустота»? функции void не имеют возвращаемого значения, поэтому они не могут вернуть ничего для печати. –

+1

Черт, что вы даже подразумеваете под «напечатать функцию»? – user2357112

+0

Вы, конечно же, не хотите печатать функцию самостоятельно. Поскольку он ничего не возвращает, вы также не можете распечатать его возвращаемое значение. Я предполагаю, что вы хотите распечатать содержимое сортируемого массива, либо до сортировки, либо после, либо и того, и другого. Так и сделайте это. –

ответ

2

В C массивы проходят «в качестве ссылки» (как указатель, для более продвинутых программистов C) к функциям. Это означает, что любое изменение функции в массиве влияет на массив в функции вызывающего абонента.

Это означает, что my_array (после вызова функции) теперь содержит отсортированный массив (потому что функция изменила его).

Таким образом, вместо возвращаемого значения, вы можете просто напечатать my_array, как это:

int main() 
{ 

    int i; 
    int my_array[1000]; 

    for (i = 0; i < 1000; i++) { 
     my_array[i] = rand(); 
    } 

    shellsort(my_array, 1000); 

    for (i = 0; i < 1000; i++) { 
     printf("%d\n", my_array[i]); 
    } 

    return 0; 
} 
+1

Обратите внимание: в ** C ** нет такой вещи, как _ «передача по ссылке» _. В ** C ** массив передается как _pointer к его первому элементу_. Указатель передается _ значением value_, но массив не копируется, что позволяет вызываемой функции изменять его содержимое. – user3078414

+0

Указатель ** не ** ссылка! И вы не передаете массив по указателю (по крайней мере, не как массив), а указателю на первый элемент. – Olaf

+0

Конечно, конечно. Но говорить «прохождение по ссылке» гораздо понятнее новичкам (предполагая, что он еще не научился указателям и более сложным предметам) –

0

Измените innnermost forloop на

for (j = i - gap; j >= 0 && v[j] > v[j + gap]; j -= gap) 
    { 
    /* You need {} for a block of statements 
    * if you miss the {}, the forloop will have only the next immediate 
    * statement under its jurisdiction 
    */ 
    temp = v[j]; 
    v[j] = v[j + gap]; 
    v[j + gap] = temp; 
    } 

Функция типа пустоте ничего не вернется. Однако, поскольку вы получаете отсортированный массив обратно в main.

Таким образом, вы можете напечатать массив, используя простой for-loop как

for (i = 0; i < 1000; i++) { 
     printf("%d\n", my_array[i]); 
    } 
+0

Могу ли я знать, для чего это относится? – sjsam