Как правильно отсортировать структуру по полю динамической строки с помощью qsort(СИ)?

153
18 мая 2022, 16:30

пишу интерпретатор команд. Есть входной файл, в котором даны инструкции вида:

myvar=15;
bg=25;
ccc=bg+myvar;
print ccc;
bg=ccc*myvar;
var=12;
b=c+d;
az=128;
print;

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

typedef struct memoryCell
{
    char    *name;
    int     data;
}memoryCell;

Сам фрагмент кода, в котором применяется сортировка, выглядит следующим образом:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "memorycell.h"
char    **parse_string(char string[], int *size);          // просто возвращает массив строк вида "myvar" "=" "15" ";"
int     struct_cmp_by_name(const void *a, const void *b);
int     dichotomy_search(memoryCell *variables, int left, int right, char *string);
/*task - variables processing
returns 1 if correct*/
int     variable_processing(FILE *file, memoryCell *variables)
{
    int     i, j;
    char    **parsed_string = NULL;
    char    string[BUFSIZ];
    int     size;
    int     amount_of_variables;
    int     counter;
    size = 0;
    counter = 1;
    amount_of_variables = 0;
    variables = NULL;
    while(!feof(file))
    {
        fgets(string, sizeof(string), file);
        strtok(string, "\n");
        parsed_string = parse_string(string, &size);
        /*initialization of variable*/
        if(strcmp(parsed_string[0], "print") && size == 4)
        {
            variables = (memoryCell *)realloc(variables, ++amount_of_variables * sizeof(memoryCell));
            variables[amount_of_variables - 1].name = (char *)malloc(strlen(parsed_string[0]) * sizeof(char));
            qsort(variables, amount_of_variables - 1, sizeof(memoryCell), struct_cmp_by_name);
            strcpy(variables[amount_of_variables - 1].name, parsed_string[0]);
            variables[amount_of_variables - 1].data = atoi(parsed_string[2]);
            printf("[INITIALIZATION]: %s == %d\n\n", variables[amount_of_variables - 1].name, variables[amount_of_variables - 1].data);
        }
        /*operations with variables*/
        else if(strcmp(parsed_string[0], "print") && size == 6)
        {
            //проверка на существование элементов операции и произведение операции
            printf("[OPERATION]: new operation\n\n");
        }
        /*print variables*/
        else if(!strcmp(parsed_string[0], "print"))
        {
            if(size == 2)
            {
                printf("[PRINT ALL]: %s == %d\n", variables[0].name, variables[0].data);
                for(i = 1; i < amount_of_variables; i++)
                {
                    printf("------------ %s = %d\n", variables[i].name, variables[i].data);
                }
                printf("\n");
            }
            else if(size == 4)
            {
                // if(dichotomy_search(variables, 0, amount_of_variables - 1, parsed_string[2]))
                // {
                //     printf("\n%s is exist!!!\n\n", parsed_string[2]);
                // }
                // else
                //     return (counter);
            }
            else
            {
                return (counter);
            }
        }
        counter++;
    }
    for(i = 0; i < amount_of_variables; i++)
    {
        printf("%s = %d\n", variables[i].name, variables[i].data);
    }
    return (0);
}
int     struct_cmp_by_name(const void *x, const void *y)
{
    memoryCell *a = (memoryCell *)x;
    memoryCell *b = (memoryCell *)y;
    return strcmp(a->name, b->name);
}
/*return 1 - correct(found)
return 0 - incorrect(didn`t find)*/
int dichotomy_search(memoryCell *variables, int left, int right, char *string) 
{
    //todo search element in struct
}
READ ALSO
Конфликт размера операндов

Конфликт размера операндов

нужно значение из регистра edx перенести в массив символовНе знаю как исправить конфликт операндов

305
Методы минимизации функции нескольких переменных

Методы минимизации функции нескольких переменных

Какой метод поиска минимума функции лучше всего использовать для такой задачи: Есть функции двух, трёх переменных и нужно найти минимальное...

178
Действие функции fflush()

Действие функции fflush()

Не понимаю, какое действие выполняет функция php fflush()В следующем примере у неё как будто нет никакого эффекта:

284
Отдать файл для скачивания пользователю

Отдать файл для скачивания пользователю

Отправляю POST с параметрами, получаю файл на скачиваниеПробую сделать подобное на php, но в консоле вижу только содержимое файлы, как отдать...

249