سؤال

كيف يمكنني تخصيص ذاكرة لمتغير char (وليس مؤشر char) داخل البنية؟
(أسماء المتغيرات باللغة البرتغالية، آسف إذا كان الأمر مربكًا نوعًا ما)

لدي هذا الهيكل:

typedef struct node{
    char rotulo[10], instrucao[1][2][10], flag;
    int simplificado;

    struct node *referencias[2];
    struct node **antecessores;
    int nrAntecessores;

    struct node *ant;
    struct node *prox;
} Estado;

وهذه هي الوظيفة insere() يقوم بتعيين القيم المقروءة من ملف الإدخال في عقدة جديدة:

void Insere(char *rotulo, char instrucao[][2][10], int qtdInstrucao, char flag){
    int i,j;
    Estado *NovoEstado;
    NovoEstado = (Estado*)malloc(sizeof(Estado));
    NovoEstado->prox = NULL;
    NovoEstado->ant = P->ult;
    strcpy(NovoEstado->rotulo, rotulo);
    NovoEstado->flag = flag;
    NovoEstado->antecessores = NULL;
    NovoEstado->nrAntecessores = 0;
    NovoEstado->simplificado = 0;

    for(i=0;i<qtdInstrucao;i++){
        realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));
        strcpy(NovoEstado->instrucao[i][0], instrucao[i][0]);
        strcpy(NovoEstado->instrucao[i][1], instrucao[i][1]);
    }
}

هذا NovoEstado->flag = flag; لا يعمل...
مباشرة بعد أن قمت بتعيينه، إذا قمت بالطباعة NovoEstado->flag أحصل على القيمة الصحيحة، ولكن إذا وضعتها بعد ذلك for بنهاية الوظيفة، عندما أقوم بالطباعة NovoEstado->flag لقد حصلت على الحرف الأول من NovoEstado->rotulo...
يحدث الشيء نفسه عندما أحاول الطباعة flag في main()...

أعتقد أن هذا لأنني لا أخصص مساحة الذاكرة بشكل صحيح flag في Insere(), ، هل هذا صحيح؟وكيف أصلحه؟

أنا متأكد من أنه سؤال سهل للغاية، ومن المحتمل أنني عرفت هذا مرة واحدة، لكنني نسيت ولم أتمكن من العثور عليه في أي مكان...لذا فإن أي مساعدة ستكون موضع تقدير كبير

يحرر

باتباع نصيحة ocdecio، قمت بإنشاء مؤشر إلى مصفوفة ثنائية الأبعاد، من أجل الحصول على مصفوفة ديناميكية ثلاثية الأبعاد.
هدفي هو الحصول على "جدول" مثل هذا:

  10 chars | 10 chars  
|__________|__________|
|__________|__________|
|__________|__________|

حيث يكون عدد الأسطر ديناميكيًا، ولكنه دائمًا عبارة عن مصفوفة من سلسلتين مكونة من 10 أحرف.

والآن هذا ما أفعله بشكل رئيسي:

    char estado[127], rotulo[10], strInstrucoes[117], *conjunto = calloc(21, sizeof(char)), flag;
    char (*instrucao)[2][10];

    FILE * entrada;
    Automato *Aut = (Automato*)malloc(sizeof(Automato));

    if((entrada = fopen(argv[1], "r")) != NULL){
        CriaAutomato(Aut);
        while(fgets(estado, 127, entrada)){
            flag = 0;
            sscanf(estado,"%[^:]: %[^;]; %c", rotulo, strInstrucoes, &flag);
            instrucao = calloc(1, sizeof(char[2][10]));
            conjunto = strtok(strInstrucoes,"() ");
            for(i = 0; conjunto != NULL; i++){
                realloc(instrucao, i+1*sizeof(char[2][10]));
                sscanf(conjunto,"%[^,],%s", instrucao[i][0], instrucao[i][1]);
                printf("%s || %d\n", instrucao[i][1], i);
                conjunto = strtok(NULL, "() ");
            }
            Insere(Aut, rotulo, instrucao, i, flag);
            free(instrucao);
        }
        fclose(entrada);

ولكن هذا لا يعمل...
هذا هو المدخلات المقروءة من الملف

adsasdfg2: (abc,123) (def,456) (ghi,789);

ولكن حتى قبل أن أتصل Insere أنا لا أقوم بتعيين القيم الصحيحة لـ instrucao بالطريقة التي أريدها، لأن هذا هو ناتج ذلك printf

123
454
789

بدلاً من ما أهدف إليه

123
456
789

ما هو الخطأ؟

(قبل أن يسأل أحد، هذا هو جزء من الواجبات المنزلية، ولكن لا ال العمل في المنزل.مهمتي هي إنشاء أداة تصغير حتمية محدودة لـ Automata، وهذا مجرد خطأ يتعلق بإدخال البيانات)

شكرا جزيلا

هل كانت مفيدة؟

المحلول

من المحتمل أن تكون مشكلتك في هذا السطر:

realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));

ليست هناك حاجة لتخصيص أي شيء داخل الهيكل الخاص بك لأن الحقل instrucao يتم تعريفه بشكل ثابت من خلال البيان instrucao[1][2][10], ، فهي ليست بنية مخصصة ديناميكيًا.

نصائح أخرى

أعتقد أن هذا السطر هو المشكلة:

realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));

في البنية، يتم تعريف instrucao على أنها جزء من الذاكرة المستمرة ولكنك تقوم الآن بتخصيص ذاكرة وتعيين المؤشر.

حاول التعليق عليه، لا تحتاج إلى تخصيص ذاكرة لهذا المتغير.

لا تحتاج إلى تخصيص العلم.إنه حرف محدد داخل البنية (على عكس المؤشر).

سبب الخطأ هو الكتابة فوق محتويات العلامة داخل البنية أثناء حلقة for التي تكتب إليها NovoEstado->instrucao (أي.إنها خربشات في الذاكرة أو الكتابة فوقها).

تحديث:كما يشير @ocdecio، فإنك لا تحتاج إلى إعادة التخصيص داخل الحلقة، كما هو الحال instrucao يتم أيضًا تخصيصها بشكل ثابت.

لا أعرف القصد من الكود، لكن من المؤكد أنه من غير القانوني القيام بما يلي:

realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));

في الأساس، تم تخصيص البنية المحتوية باستخدام malloc، ولكن العضو الداخلي المعني عبارة عن مصفوفة محددة بشكل ثابت ولا يمكن إعادة توزيعها باستخدام الكومة (لأن مدير الكومة يتتبع فقط المؤشر Malloced إلى العقدة).

عقدة بنية typedef {شار روتولو[10]، تعليمات [1] [2] [10]، علَم؛

إذا كنت ترغب في تغيير الحجم ل تعليمات ديناميكيًا، يجب عليك تعريفه كنوع مؤشر وتخصيص ذاكرة له بشكل منفصل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top