2017-02-14 4 views
1

Это ело у меня весь день. Я относительно новичок в C, и я НЕ МОГУ ПОЛУЧИТЬ эту работу, и я понятия не имею, почему. У меня есть 3 файлов ..C-неявное объявление функций time, rand, printf, все мои вызовы функций

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

assignment_1.h --- -------------------------------------------------- ------

#ifndef ASSIGNMENT_1_H 
#define ASSIGNMENT_1_H 

#define NULL 0 

int CalculateFactorial(int input); 
int CalculateFibonacci(int input); 
void ReverseArray(int size, int array[]); 
void ShuffleArray(int size, int array[]); 

#endif 

Main.c ---------------------------------- -------------------------------------

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


int main(){ 

int fact = CalculateFactorial(15); 
int fib = CalculateFibonacci(15); 

printf("Factorial: %d\n", fact); 
printf("Fib: %d\n", fib); 

int array[] = {1,2,3,4,5,6}; 
int size = 6; 

ReverseArray(size, array); 
ShuffleArray(size, array); 

return 0; 


}/*end main*/ 

assign_1.c --- ------------------ ------------------------------------------

#include "assignment_1.h" 


int CalculateFactorial(int input){ 

if(input<=0) return 0; 


int factorial = input; 
int multiplier = input; 

while(multiplier > 1){ 
    factorial *= multiplier; 
    --multiplier; 
}/*end while*/ 

return factorial; 

}/*end calcfact*/ 



int CalculateFibonacci(int input){ 

if(input<=0) return 0; 

else if(input == 1)  return 1; 

return CalculateFibonnaci(input-1) + CalculateFibonacci(input-2); 

}/*end calcfib*/ 



void ReverseArray(int size, int array[]){ 

int last = size-1; 
int first = 0; 
int temp; 

while (last-first > 1){  /*stops the loop if size is even*/ 

temp = array[last]; 
array[last] = array[first]; 
array[first] = temp; 

++first; 
--last; 

if(last-first == 2)  break; /*stops loop if size is odd*/ 

}/*end while*/ 

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

}/*end reverse*/ 



void ShuffleArray(int size, int array[]){ 

srand((unsigned int)time(NULL)); 

int i; 
for (i = 0; i < size; ++i){ 

    int idx = rand()%size; /*random unsigned int between 0 and the 
         max index of the array*/ 

    int temp = array[i]; 
    array[i] = array[idx]; 
    array[idx] = temp; 

}/*end for loop*/ 

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

}/*end shuffle*/ 

I продолжать получать тонной ошибок все о том, предупреждение: неявная декларация функции «»]

Я очень признателен за любую помощь ...

+0

Не могу видеть это, но обратите внимание: 1) Вам не нужно указывать 'NULL'2' 'srand()' должен вызываться один раз, в начале программы, 3) 32-битный 'int' не будет содержать значение '15!'. –

+3

Вам нужно «# включать» заголовки для функций, используемых в 'assign_1.c' внутри' assign_1.c' (или другой заголовок, который он включает). Можно включить их в оба файла .c', если оба файла используют эти функции. – Dmitri

+0

@Dmitiri, Я не слишком уверен, понимаю ли вы, что вы имеете в виду .. в начале assign1.c и main.ci имеют '#include" assign_1.h "' – spencerktm30

ответ

2

Поскольку вы собираете assignment_1.c отдельно main.c (который является разумным если вы планируете использовать компоновщик, чтобы связать их вместе, как только они скомпилированы), вам необходимо включить эти заголовки в этот файл, тоже; они не переносятся автоматически с одной единицы перевода на другую.

Вставьте их в assignment_1.c:

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

Я пятнистый дополнительную ошибку, будучи определение NULL вы указали в assignment_1.h; вы должны никогда определить NULL себя, так как это стандартный символ. Это было бы похоже на написание собственных printf и scanf.

NULL определен в заголовке <stddef.h>. Включите это также, если вы хотите использовать NULL.

+1

Я также хотел бы отметить, что 'NULL' специфична для реализации и не всегда равна '0' (или' ((void *) 0x0)) ... это значение, которое определяет операционная система в соответствии с его конкретным дизайном перевода карты памяти (хотя она заканчивается определяемый как '((void *) 0x0)' 99% времени). – Myst

+0

@Myst 'NULL' - константа нулевого указателя, и по этому определению * требуется * для сравнения равным нулю. Я понимаю, что вы говорите; он может не иметь базового шаблона нулевого бита. Я не считаю, что детали, имеющие достаточно важное значение для этого вопроса, вводят его в ответ; если люди хотят читать дальше, они будут видеть эти комментарии довольно быстро. Ta :) – Sebivor

+0

Это правда :-) – Myst

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