2013-10-07 3 views
0

Я новичок в C, но сейчас я работаю над проектом, который я не могу решить, как я могу делать то, что необходимо.Имитация array_pop для различных структур в C

У меня есть 2 разных массива struct, они совершенно разные, и я пытаюсь сделать то же самое действие, что и массив array_pop PHP, т. Е. Удалить последний элемент структуры массива.

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

Мои структуры определены следующим образом

typedef struct CallLogSearchResultStruct 
{ 
    long date; 
    int dRowIndex; 
} callLogSearchResultStruct; 

typedef struct CallLogSearchDataStruct 
{ 
    char * date; 
    char * time; 
    char * bParty; 
    char * aParty; 
    float duration; 
    char * cleardownCause; 
    struct CallLogSearchOutboundStruct * outboundLegs; 
} callLogSearchDataStruct; 

Ниже, как структуры инициализируются

callLogSearchData = calloc(numRows, sizeof(callLogSearchDataStruct)); 
callLogSearch = calloc(numRows, sizeof(callLogSearchResultStruct)); 

numRows является количество структур, чтобы содержать в массиве.

Ниже, как я использую структуры

callLogSearchData[dataRow].aParty = NULL; 
callLogSearchData[dataRow].bParty = NULL; 
callLogSearchData[dataRow].cleardownCause = NULL; 
callLogSearchData[dataRow].date = NULL; 
callLogSearchData[dataRow].time = NULL; 
callLogSearchData[dataRow].outboundLegs = NULL; 

Извиняюсь, если это простой прямой ответ, я не могу найти что-нибудь на Google, хотя и не совсем уверен, что это будет называться так может быть, я используя неправильные ключевые слова.

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

+0

Я знаю, что это помечено как «c», но может быть полезно использовать шаблоны C++ в случае, если у вас есть доступ к компилятору C++. Шаблоны предназначены для такого рода проблем. –

+1

Для массивов C, созданных с помощью 'calloc',' malloc' и т. Д., Вы не можете «удалить» последний элемент в массиве без выделения нового массива и копирования всего, кроме последнего элемента, если только «удалить», вы просто хотите скопировать объект из другого места, а затем пометить запись в массиве как пустую/неиспользуемую в некотором роде ... – twalberg

ответ

1

Что вы подразумеваете под "удалить"? Как распределяются массивы?

Если у вас есть массив, созданный в декларации, такие как:

struct foo my_foos[123]; 

нет ничего вы можете сделать, чтобы изменить тот факт, что my_foos длиной 123 элементов. Вы можете, конечно, выбрать игнорировать некоторые из них, имея отдельную переменную size_t foo_count, которую вы поддерживаете.

Массивы в C обычно не являются динамическими (в отличие от списков/массивов на многих языках высокого уровня). Вы можете реализовать динамический массив, используя malloc(), что не слишком сложно, но неясно, действительно ли это то, что вы сделали.

+0

Спасибо за информацию, я обновил свой вопрос, извините, я забыл, как может быть массив создано другое, я использую calloc – Boardy

0

Если вы открыты для использования внешних файлов, посмотрите на utarray:

Это коллекция макросов, хранящихся в один заголовок, который позволяет то, что вы ищете. Не нужно связывать дополнительную библиотеку, просто #include файл, и у вас есть то, что вам нужно.

Вам нужно будет реализовать пользовательский UT_icd, предоставляющий функции для инициализации, копирования и освобождения элементов, хранящихся в массиве.

+0

Спасибо за информацию, к сожалению, я не могу. Это нужно сделать, используя то, что включено в C, нет внешних библиотек – Boardy

+0

. Макросы включены в C. На самом деле это не библиотека, а просто файл заголовка с некоторыми макроопределениями в нем. – eckes

0

Что вы хотите на самом деле связанный список. Это набор структур, каждый из которых указывает на N-й элемент и на следующий элемент в списке. Таким образом, вы можете легко удалить любой элемент, отключив его в цепочке. Вы можете google для связанного списка lib в C или реализовать один (это хорошее упражнение). Массивы в C - это статические диапазоны памяти с достаточным пространством для ваших элементов. Больше ничего. В общем случае вы не можете удалить один элемент.Однако вы можете использовать функцию realloc для изменения размера существующего массива. Для чего вы пытаетесь сделать, я бы пошел на связанный список.

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