2017-02-12 4 views
1

Предложенный результат - это печать тех же значений, которые мы вводим, но результат равен нулю после первой строки.Передача массива функции изменяет свои значения?

#include<stdio.h> 
void display(int *q, int); 

int main() { 
    int i,j,n; 
    int d[50][50]; 
    printf("Input the order\t"); 
    scanf("%d", &n); 

    for (i=0;i<=(n-1);i++) { 
     for (j=0;j<=(n-1);j++) { 
      scanf("%d", &d[i][j]); 
     } 
    } 
    display (d, n); 
} 

void display (int *q, int r) { 
    int i,j; 

    for (i=0;i<r;i++) { 
     for (j=0;j<r;j++) { 
      printf("%d\t", *(q + i*r + j)); 
     } 
     printf("\n"); 
    } 
} 
+2

Компилятор не знает размеров 'd' после того, как вы передадите его' display'. – goodvibration

+0

Найдите, как передать многомерный массив функции в C. См., Например, [этот пост] (http://stackoverflow.com/q/16943909/478288). – chrisaycock

ответ

0

Ваша функция объявлена ​​с параметром типа int * , Вы пытаетесь передать аргумент типа int [50][50], который распадается на указатель типа int (*)[50]. Эти типы указателей несовместимы. Язык не поддерживает неявное преобразование от int (*)[50] до int. Ваш код не является действительной программой на C, и я уверен, что ваш компилятор рассказал вам об этом.

Более значимые вещи, чтобы сделать было бы объявить функцию

void display (int n, int q[n][n]) 

и получить доступ к элементам массива естественным образом, как

q[i][j] 

Однако для этого вам придется использовать истинные размеры массива: n (т.е. 50 в вашем случае). Если вы хотите обработать меньшую подматрицу элементов, вам придется передавать ее размер отдельно.

Но если вы действительно хотите использовать свой «взломать», вы должны будете использовать явное приведение при вызове вашей функции

display ((int *) d, n); 

и иметь в виду, что каждая строка исходного массива содержит еще 50 элементов , как заявлено, независимо от значения n. Это означает, что внутри вашей функции вам придется использовать 50 как множитель размера строки

void display (int *q, int r) { 
    int i,j; 

    for (i=0;i<r;i++) { 
     for (j=0;j<r;j++) { 
      printf("%d\t", *(q + i*50 + j)); 
     } 
     printf("\n"); 
    } 
} 
+0

Я действительно удивляюсь, кто это делает ... –

0

ваш display процедура предполагает, что 2D массив [n][n] тогда как [50][50].

Вы должны передать фактический размер 2D-массива вместе с n, подпрограмма display не может знать размер 2D-массива.

Вы можете объявить массив динамически, как это:

printf("Input the order\t"); 
    scanf("%d", &n); 
    int d[n][n]; 

, а затем избежать предупреждений

test.c:20:18: warning: passing argument 1 of 'display' from incompatible pointer type 
     display (d, n); 

здесь литья явно указатель 1D (так как вы знаете структуру):

display ((int*)d, n); 
+0

Кто это делает? #include void display (int * q, int); int main() { int a [3] [3] = {1,2,3,4,5,6,7,8,9}; дисплей (a, 3); } void display (int * q, int r) { int i, j; для (i = 0; i

+0

@NibirPawanDas - ТАК не форум, поэтому, пожалуйста, избавитесь от этого менталитета. В частности, должности не связаны с обсуждением. Не публикуйте всю программу в комментарии и ожидайте ее обсуждения. – StoryTeller

+0

работает, потому что ваши размеры совпадают! Ввод 50 в вашей текущей программе тоже работает. Проверьте мое редактирование. –

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