несовместимый тип указателя - PullRequest
4 голосов
/ 02 ноября 2010

Я только начал программировать, поэтому указатели и массивы сбивают меня с толку. Эта программа просто назначает случайные числа от 0 до 9 в массив и выводит их

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

int function(int *num[]){                         
     int i;
     for(i=0; i<10; i++){
          srand((unsigned)time(NULL));
          *num[i] = rand()%10;                     
          printf("%d", *num[i]);
     }
     return 0;
}

int main(){
     int num[10];
     function(&num);              // incompatable pointer type (how do i fix this?)
     return 0;
}

Thankyou

Ответы [ 4 ]

6 голосов
/ 02 ноября 2010

Измените код так, чтобы он выглядел примерно так:

int function(int num[]){                          
     int i; 
     for(i=0; i<10; i++){ 
          srand((unsigned)time(NULL)); 
          num[i] = rand()%10;                      
          printf("%d", num[i]); 
     } 
     return 0; 
} 

int main(){ 
     int num[10]; 
     function(num);
     return 0; 
}

В main() вы выделяете массив из 10 целых чисел.Вызов function(num) передает адрес этого массива (технически, адрес первого элемента массива) в функцию function().В объявлении параметра int num[] почти точно эквивалентно int *num (я позволю вам задуматься над этим).Наконец, когда вы получаете доступ к элементам num[] из функции, вам не нужно никаких дополнительных *.Используя num[i], вы получаете доступ к i '-ому элементу массива, на который указывает num.

. Это может помочь вспомнить, что в C следующее точно так же:*

num[i]
*(num+i)
1 голос
/ 02 ноября 2010

Все зависит от того, чего вы хотите достичь в итоге.

(1) Если ваша функция function предназначена для использования с массивами времени выполнения, то вам нужно передать указатель на первый элемент массива. Это достигается с помощью следующих эквивалентных деклараций

int function(int *num)

или

int function(int num[])

Внутри функции вы должны получить доступ к переданному массиву как

num[i] = rand() % 10;  

И вы вызываете свою функцию как

function(num); 

Конечно, когда размер массива является значением времени выполнения, имеет смысл также передать этот размер функции, что означает, что ваша функция должна иметь следующий интерфейс

int function(int num[], size_t n)

И реализовать его для массива размером n вместо жесткого кодирования 10 непосредственно в вашей реализации.

(2) Если ваша функция function предназначена для использования с массивами фиксированного размера во время компиляции (в данном случае 10), тогда лучше будет передать указатель на весь массив. Это достигается следующей декларацией

int function(int (*num)[10])

Внутри функции вы должны получить доступ к переданному массиву как

(*num)[i] = rand() % 10;  

И вы вызываете свою функцию как

function(&num); 

Так что это либо (1), либо (2).

То, что у вас есть в вашем коде, выглядит как смесь этих двух подходов. Точнее, ваш код выглядит как попытка реализовать second подход, но в нем отсутствуют некоторые важные скобки:)

Большинство ответов, данных вам до сих пор, предлагают использовать первый подход. Однако, учитывая, что размер массива на самом деле является постоянной времени компиляции в вашем случае, я бы предложил придерживаться второго подхода.

1 голос
/ 02 ноября 2010

Вам не нужно передавать указатель на ваш массив.Просто перейдите в массив.Я исправил ваш код указателя ниже.

Кроме того, вам не следует сбрасывать начальное значение (srand) при каждой итерации цикла for.

int function(int num[]){                          
     int i; 
     srand((unsigned(time(NULL));
     for(i=0; i<10; i++){ 
          num[i] = rand()%10;                      
          printf("%d", num[i]); 
     } 
     return 0; 
}

int main(){ 
     int num[10]; 
     function(num);  
     return 0; 
} 
0 голосов
/ 02 ноября 2010

Используйте либо int *num, либо int num[], не используйте оба вместе, как сейчас (int *num[]). Массив передается функции как указатель на первый элемент, то есть int *num, что эквивалентно int num[].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...