2010-09-27 3 views
3

Как вернуть статический многомерный массив символов?Что не так в следующем коде? Как исправить это?

#include<stdio.h> 
#include<conio.h> 

#define SIZE 3 

char ** MyFunction(void) 
{ 
    static char arr[SIZE][SIZE]={ 
            {'A', 'B', 'C'}, 
            {'D', 'E', 'F'}, 
            {'G', 'H', 'I'} 
           }; 
    return arr; 
} 

void main(void) 
{ 
    char ** arr1 = NULL; 
    int i=0; 
    int j=0; 

    arr1 = MyFunction(); 

    for(i=0 ; i<SIZE ; i++) 
    { 
     for(j=0 ; j<SIZE ; j++) 
     { 
      printf("%c, ", arr1[i][j]); 
     } 

     printf("\n"); 
    } 

    getch(); 
} 
+0

Какова ваша ошибка? msg? Как вы знаете, что это неправильно? –

+0

Ошибка. Ошибка вывода. – anonymous

+1

Похоже, вы пытаетесь создать глобальный массив, но маскируете его за функцией. Почему бы просто не определить его в основном? – JoshD

ответ

4

Прежде всего, arr не может быть char**. Это адрес, но это не адрес указателя - это адрес символа [SIZE].

Мне всегда было легче справиться с ними, разделив размеры вверх, используя typedefs.

#define SIZE 3 
typedef char ROW[SIZE]; // a ROW type is an array of chars 

ROW* MyFunction(void) 
{ 
    static ROW arr[SIZE]={ // arr is an array of ROW objects 
            {'A', 'B', 'C'}, 
            {'D', 'E', 'F'}, 
            {'G', 'H', 'I'} 
           }; 
    return arr; 
} 

void main(void) 
{ 
    ROW* arr1 = NULL; 
    // etc... 
+0

К сожалению, это тоже не работает!# include # include #define РАЗМЕР 3 ЬурейеЕ символ ROW [РАЗМЕР]; ROW * Моя_функция (недействительными) { статическая СТРОКА обр [размер] = { { 'A', 'B', 'C'}, { 'D', 'E', 'F'}, {'G', 'H', 'I'} }; return arr; } void main (void) { ROW * arr1 = NULL; \t int i = 0; \t для (I = 0; я <размер; я ++) { \t \t \t Е ("% С", arr1 [I]); \t} \t getch(); } – anonymous

+0

Поскольку 'arr1 [i]' не является символом, это ROW, который представляет собой массив символов. IOW, все остальное в вашей программе, кроме того, что я изменил, должно остаться прежним. –

+0

Могу ли я сделать это без typedef? Если да, то как? – anonymous

1

Учитывая заявление

char arr[SIZE][SIZE]; 

то тип выраженияarr является char (*)[SIZE]; поэтому тип функции должен быть

char (*myFunction(void))[SIZE] // myFunction returns a pointer to a SIZE-element 
{        // array of char 
    static char arr[SIZE][SIZE] = ...; 
    return arr; 
} 

Да, определение типа функции является уродливым. Версия typedef от James читается легче, но это то, что происходит под обложками.

int main(void) 
{ 
    char (*arr1)[SIZE]; 
    int i, j; 

    arr1 = myFunction(); 
    ... 
} 
0

изменение статического гольца ** обр [] [] = ...

0

Кто владеет массив?

Это очень важно, потому что часть кода должна полностью заполнить (создать, удалить) массив. Другие части кода могут читать и писать.

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

#include <stdio.h> 

enum{ SIZE = 3 }; 

void initArray(char arr[ SIZE ][ SIZE ]) { 

    char x = 'A'; 

    for(int i = 0; i < SIZE; i++) { 
     for(int j = 0; j < SIZE; j++) { 
      arr[ i ][ j ] = x; 
      x += 1; 
     } 
    } 
} 

int main() 
{ 
    char arr1[ SIZE ][ SIZE ]; 
    initArray(arr1); 

    for(int i = 0; i < SIZE; i++) { 
     for(int j = 0; j < SIZE; j++) { 
      printf("%c, ", arr1[ i ][ j ]); 
     } 
     printf("\n"); 
    } 
} 

После проводить несколько минут в поиске, я нашел good discussion on multi-dimensional array in C.

Еще один комментарий на стороне. обратите внимание, что я сделал пару других изменений в коде, некоторые из них являются дизайном (например, с использованием enum вместо #define, объявляя переменные (i, j в большинстве локальных областей), в то время как некоторые из них являются форматированием. Программы предназначены в основном для общения с другими человеческими программистами , поэтому читаемость кода очень важно.

+0

Вы прочитали мое требование ????????? – anonymous

+0

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

0

conio.h + Геч() не ANSI C. недействительным основной не ANSI C. Возьмите новый тип, это сделать проще.

#include<stdio.h> 
#include<conio.h> 

#define SIZE 3 
typedef char CHAR3[SIZE]; 

CHAR3 *MyFunction(void) 
{ 
    static CHAR3 arr[]={ 
            {'A', 'B', 'C'}, 
            {'D', 'E', 'F'}, 
            {'G', 'H', 'I'} 
           }; 
    return arr; 
} 

main(void) 
{ 
    CHAR3 *arr1 = NULL; 
    int i=0; 
    int j=0; 

    arr1 = MyFunction(); 

    for(i=0 ; i<SIZE ; i++) 
    { 
     for(j=0 ; j<SIZE ; j++) 
     { 
      printf("%c, ", arr1[i][j]); 
     } 

     printf("\n"); 
    } 

    getch(); 
} 
Смежные вопросы