2016-11-17 6 views
-1

Извините за это название. Я действительно не знал, как определить эту проблему.Указание на массивы с использованием функции void

Мне нужно было объявить целочисленный массив из N чисел и заполнить его случайными числами в функции void. Затем этот массив должен быть напечатан в основном. Дело в том, что мне не разрешено использовать printf в функции void, поэтому единственный способ печати в основном - использовать указатели, я думаю. Мои знания ограничены, поскольку я новичок в указателях. Thx заранее и извините за плохой английский.

Вот мой код. Когда я компилирую, он маркирует ошибку сегментации.

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

void form(); 

int main() 
{ 

    int N, a[100]; 

    printf("Input index: \n"); 
    scanf("%d", &N); 

    form(N, &a); 

    printf("Array: \n"); 

    for (int i = 0; i < N; i++) { 
     printf("a[%d] = %d", i, a[i]); 
    } 

} 


void form(int N, int *ptr[100]) 
{ 

    srand(time(NULL)); 

    for (int i = 0; i < N; i++) { 
     *ptr[i] = rand() % 46; 

    } 
+0

Вашего компилятор должен кричать на вас. Используйте правильный прототип, ваш код не соответствует стандарту и вызывает неопределенное поведение. (И это гораздо более фундаментально, чем указатели.Пропустили ли вы главу о функциях и объявлениях функций в своей книге C?) – Olaf

+0

вы можете использовать 'printf' в любой функции, которую вы хотите. – user3528438

+0

user3528438 Это школьное упражнение, и профессор сказал мне, чтобы я не использовал printf. @Olaf Правильно ли этот прототип: void form (int, int). Объявление функции кажется прекрасным. Так меня учили. – Misery

ответ

0

В коде есть несколько проблем.

1) Ваша декальвация вашего массива form() устарела. Используйте правильный прототип.

2) Для объявления VLA объявите его после чтения N вместо использования массива фиксированного размера.

3) Массив преобразуется в указатель на его первый элемент при передаче функции. См: What is array decaying?


#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

void form(int, int*); /* see (1) */ 

int main(void) /* Standard complaint prototype for main. 
       If you need to pass arguments you can use argc, and argv */ 
{ 
    int N; 

    printf("Input size: \n"); 
    scanf("%d", &N); 

    int a[N]; /* see (2) */ 
    form(N, a); /* see (3) */ 
    printf("Array: \n"); 

    for (int i = 0; i < N; i++) { 
     printf("a[%d] = %d", i, a[i]); 
    } 
} 


void form(int N, int *ptr) { /* Modified to match the prototype 
    srand(time(NULL)); 

    for (int i = 0; i < N; i++) { 
     ptr[i] = rand() % 46; 

    } 
} 
0

Так пара вещей:

void form(); 

Как Olaf намекал, эта декларация является ошибочной - вам не хватает соответствующих параметров. Вместо этого, он должен быть

void form(int N, int ptr[100]); 

Основная причина вашей программы происходит сбой из-за следующей строки:

*ptr[i] = rand() % 46; 

Вы разыменования указателя на I, который Actaully дает вам ряд - что вы хотите, чтобы присвоить значение указателя на I новое случайное значение:

ptr[i] = rand() % 46; 

как связанный читать, видеть это question о прохождении массива в качестве FUNC (в основном, int ptr[] - это то же самое, что и int * ptr)

+1

void form (int N, int ptr [100]); – user3528438

+0

@ user3528438 Извините, забыл об этом, спасибо. – schil227

+0

@ user3528438: Это неправильно. Это должно быть 'int ptr [N]' (самая ясная версия) или 'int ptr []' или 'int * ptr', но не' int ptr [100] '. – Olaf

-1

Небольшие изменения на вашем коде:

1) Исправление и упрощение обработки при вызове функции параметра. Просто передайте «a», это массив, так что это адрес, вы можете использовать int *ptr или int ptr[], или int ptr[100] в списке формальных параметров для него. Поэтому вы можете просто использовать ptr [i] в ​​своей функции.

2) Сделать прототип функции из декларации старого стиля, предоставляющего список параметров.

3) int i; декларации перед циклом - не обязательный, зависит от компилятора стандартного

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

void form(int N, int *ptr); 

int main() 
{ 

    int N, a[100]; 

    printf("Input index: \n"); 
    scanf("%d", &N); 

    form(N, a); 

    printf("Array: \n"); 
    int i; 
    for (i = 0; i < N; i++) { 
     printf("a[%d] = %d", i, a[i]); 
    } 

} 


void form(int N, int *ptr) 
{ 

    srand(time(NULL)); 
    int i; 
    for (i = 0; i < N; i++) { 
     ptr[i] = rand() % 46; 

    } 
} 
+0

Который учит ОП ровно ничто. Просто кормит его рыбой. – Olaf

+0

@ Олаф. Конечно, вы правы. Я исправил свой ответ. – quantummind

+0

«Коррекция объявления прототипа с помощью списка параметров». - Вы имеете в виду ** сделать его прототипом **. Как и сейчас, это не прототип, а только декларация старого стиля. – Olaf

 Смежные вопросы

  • Нет связанных вопросов^_^