Почему моя функция addArrays получает код компиляции клинового выхода?(ОБНОВЛЕНИЕ ИСПРАВЛЕНО) - PullRequest
0 голосов
/ 11 апреля 2019

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

Я пытался удалить if ((sizeof (* ptr1)) == (sizeof (* ptr2)) { --- введите код здесь --- }

из цикла for, однако, проблема, похоже, заключается только в самом цикле for.

//===================================Broken Code========================================
#include <stdio.h>
#define MAXIMUM 1000


int sumArrays(int arr1[], int arr2[]);
int addArrays(int arr1[], int arr2[]); 

int main()
{

int arrayOne[MAXIMUM]; 
int arrayTwo[MAXIMUM];

for(int i = 0; i <= MAXIMUM; i++)

   arrayOne[i] = i;

printf("Arrayone %d\n", arrayOne);

for(int j = 0; j <= MAXIMUM; j++) 

      arrayTwo[j] = j;  

printf("ArrayTwo %d\n", arrayTwo);

printf(" The sum of the arrays is : %d\n",sumArrays(arrayOne, arrayTwo));

printf("%d", addArrays(arrayOne, arrayTwo));

return 0;
}

int sumArrays(int arr1[],int arr2[]){

int *ptr_1; 
int *ptr_2;

ptr_1 = &arr1[0]; 
ptr_2 = &arr2[0];

int sum; 

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

sum += *ptr_1 + i;
sum += *ptr_2 + i; 

} 

return sum; 
}

int addArrays(int arr1[],int arr2[]){

int *ptr1 = &arr1[0];
int *ptr2 = &arr2[0]; 
int sum = 0; 
int i = 0; 
int arr3[0];

if(sizeof(*ptr1) == sizeof(*ptr2)){

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

      sum += *ptr1 +i;
      sum += *ptr2 +i;   
      arr3[i] = sum;

      }
   }

   printf("The value of array3 is %d", arr3); 
 }

Другая функция работает отлично, но функция addArrays выполняет клиновый выход и не взаимодействует.

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

Спасибо, что уделили время.

ОБНОВЛЕНИЕ: РАБОЧИЙ КОД

#include <stdio.h>
#define MAXIMUM 1000

#define ARRAY_SZ(x) (sizeof(x) / sizeof((x)[0]))


int sumArrays(int arr1[], int arr2[], size_t len);
int addArrays(int arr1[], int arr2[], int arr3[], size_t len); 

int main()
{

int arrayOne[MAXIMUM]; 
int arrayTwo[MAXIMUM];
int arrayThree[MAXIMUM];

for(int i = 0; i <= MAXIMUM; i++)
   arrayOne[i] = i;

printf("Array One %d\n", ARRAY_SZ(arrayOne));

for(int j = 0; j <= MAXIMUM; j++) 
      arrayTwo[j] = j;  
printf("Array Two %d\n", ARRAY_SZ(arrayTwo));

printf(" The sum of the arrays is : %d\n",sumArrays(arrayOne, arrayTwo, ARRAY_SZ(arrayOne)));
printf("%d", addArrays(arrayOne, arrayTwo, arrayThree, MAXIMUM));
return 0;
}

int sumArrays(int arr1[],int arr2[], size_t len){

int *ptr_1; 
int *ptr_2;

ptr_1 = &arr1[0]; 
ptr_2 = &arr2[0];

int sum = 0 ; 

for(int i = 0; i < len; i++){
sum += *ptr_1++;
sum += *ptr_2++; 
} 

return sum; 
}

int addArrays(int arr1[],int arr2[], int result[], size_t len){

   int *ptr1 = &arr1[0];
      int *ptr2 = &arr2[0];
      int *ptr3 = &result[0]; 
         int sum = 0;
         int sum2 = 0; 
            int i = 0; 



   for(int i = 0; i < MAXIMUM; i++){
      sum = *ptr1 ++;
      sum += *ptr2 ++;   
      result[i] = sum;
      printf("The result of array 3 is %d\n", *ptr3++);
            }

 }

1 Ответ

1 голос
/ 11 апреля 2019

Вот некоторые заметки:

Когда вы присваиваете / передаете / печатаете массив и, используя имя массива, вы фактически передаете ячейку памяти первого элемента в массиве (указатель). Так что, когда вы пишете:

printf("Arrayone %d\n", arrayOne);

Вы увидите адрес памяти первого элемента печатного массива. Если вы хотите распечатать весь массив, вам нужно будет пройти через него. В этом случае вы печатаете 1000 целых чисел, что может быть нежелательно.

void printArray(int * array, size_t len)
{
    while(len--)
    {
        printf("%d ", *array++);
    }
}

Чтобы получить количество элементов в массиве, вы можете сделать что-то вроде этого:

sizeof(arrayOne) / sizeof(arrayOne[0])

и вы можете поместить его в макрос следующим образом:

#define ARRAY_SZ(x)  (sizeof(x) / sizeof((x)[0]))

и назовите это так:

ARRAY_SZ(arrayOne);

Вы не можете получить размер массива, если вы получаете массив в функции (он распался на указатель), вместо этого вы должны также передать размер массива в функцию. Здесь, поскольку вы инициализируете массивы размером MAXIMUM, нам на самом деле не нужно вычислять размер массива, но мы можем просто показать, что он работает.

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

При циклическом просмотре массива вы никогда не захотите делать array[maximum], потому что индексы массива варьируются от 0 до maximum - 1

#include <stdio.h>
#define MAXIMUM 1000

#define ARRAY_SZ(x)  (sizeof(x) / sizeof((x)[0]))

int sumArrays(int arr1[], int arr2[]);
int addArrays(int arr1[], int arr2[]); 

int main()
{
    int arrayOne[MAXIMUM]; 
    int arrayTwo[MAXIMUM];
    int arrayThree[MAXIMUM];

    for(int i = 0; i < MAXIMUM; i++)
       arrayOne[i] = i;

    printf("Array one size %d\n", ARRAY_SZ(arrayOne));

    for(int j = 0; j < MAXIMUM; j++) 
          arrayTwo[j] = j;  
    printf("Array Two size %d\n", ARRAY_SZ(arrayTwo));

    printf(" The sum of the arrays is : %d\n",sumArrays(arrayOne, arrayTwo, ARRAY_SZ(arrayOne)));
    addArrays(arrayOne, arrayTwo, arrayThree, MAXIMUM);
    return 0;
}

int sumArrays(int arr1[],int arr2[], size_t len)
{
    int *ptr_1; 
    int *ptr_2;

    ptr_1 = &arr1[0]; 
    ptr_2 = &arr2[0];

    int sum; 

    for(int i = 0; i < len; i++){
        sum += *ptr_1 + i;
        sum += *ptr_2 + i; 
    } 

    return sum; 
}

void addArrays(int arr1[], int arr2[], int result[], size_t len){

   int *ptr1 = arr1;
   int *ptr2 = arr2; 
   int sum = 0; 
   int i = 0;

   for(int i = 0; i < len; i++){
      sum = *ptr1 +i;
      sum += *ptr2 +i;   
      result[i] = sum;
   }

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