Как определить пустую строковую переменную?

 

Здравствуйте.

Собственно сабж. Если есть возможность ответить подробнее, то:

1. Какое значение получает строковая переменная при инициализации?

2. Как получить ее значение (сынициализированное)? Она не равна "" . С чем ее сравнивать?

3. Как можно махом сынициализировать строковый массив (по аналогии с int ArrayInitialize( double&array[], double value, с присвоением элементам нормальной пустой строки ""? (цикл, sTmp[n] = {"", "", ... , ""), ресайз в ноль и обратно, плз, не предлагать)

Благодарю

 
Chen:

Собственно сабж.

С какой целью? Для передачи в длл?
 
komposter писал (а):
С какой целью? Для передачи в длл?


Да нет. У меня идет сброс на диск из строчного массива поэлементно. Инициализирется слив из разных мест программы по различным критериям: объем накопленной информации, время, прошедшее с последнего слива ил деинициализация эксперта. Если происходит слив по двум последним критериям, он не заполнен полностью новыми данными, а есть остатки от предыдущего цикла его заполнения. Чтобы не мудрить,я после каждого слива делаю ему ресайз до нулевого размера, а потом обратно до нужного. Дешево и сердито. Но при этом, все элементы получают значение по умолчанию. Т.е. не читаемая пустая строка. А мне ее надо определить, чтобы остановить на таком элементе слив. Все предыдущиу-то имеют какое-то значение. На первом пустом встаем. Вот кусок кода:

k = ArraySize(saTicks);
for (i = 1; i <= (k - 1); i++)
    {
    if (saTicks[i] == "") 
        {
        Print("Empty", " ", i, " of ", k," - ", saTicks[i]); 
        break;
        }
 
    Print("Write", " ", i, " of ", (k - 1)," - ", saTicks[i]);
    }
    
pReason = StringConcatenate(pReason, " ", (i - 1), "/" , (k - 1));
Print(pReason, " ..\\", sFPathName, sFIndex, " - ", 
        TimeToStr(TimeCurrent(),TIME_SECONDS));
 
FileFlush(iFileHandle);
 
ArrayResize(saTicks,0);                 // Resize to zero & ...
ArrayResize(saTicks,iBufTicksSize + 1); // ... resize to setted in externals uplevel +1
 
iBufTmrSize = GetTickCount() - iFlushTimer; // set new size of FlushTimer like in previous cycle
iFlushTimer = GetTickCount();               // reset FlushTimer
iBufTicks = 0;                              // reset buffered ticks counter
 
for (i = 0; k -1; i++) {saTicks[i] = "";}

Приходится в конце пробегаться по всем элементам с присвоением ""

 
Chen:

Да нет.

Мне кажется, проще хранить количество заполненных элементов, и "сливать" только их ( for( i = 0; i < COUNT; i ++ ) { sliv(array[i]); } ).
Одна инт переменная, и никакого геммора (и, кстати, лишних ArraySize и ArrayResize).
 
komposter:

Мне кажется, проще хранить количество заполненных элементов, и "сливать" только их ( for( i = 0; i < COUNT; i ++ ) { sliv(array[i]); } ).
Одна инт переменная, и никакого геммора (и, кстати, лишних ArraySize и ArrayResize).


Да. Конечно так. Благодарю. Я просто сам зациклился на выявлении string "" и забыл зачем это нужно. Это уже ночью было :)

Но, так или иначе, Проблема (может это только для меня?) с string "" остается... Я, кажется, уже все пересмотрел на эту тему.

 

Рекомендую перейти от одномерного строкового массива к двумерному целочисленному...

 
KimIV:

Рекомендую перейти от одномерного строкового массива к двумерному целочисленному...

Вах... А как же с моими string данными? Хранить их в виде десятичных последовательностей? Или я не так понял?
 
Chen писал (а):
Вах... А как же с моими string данными? Хранить их в виде десятичных последовательностей? Или я не так понял?
Каждый символ может быть преобразован в целое число функцией StringGetChar, а потом число может быть преобразовано обратно в символ функцией CharToStr. А целочисленный массив можно будет инициализировать функцией ArrayInitialize.
 
KimIV:
Chen писал (а):
Вах... А как же с моими string данными? Хранить их в виде десятичных последовательностей? Или я не так понял?
Каждый символ может быть преобразован в целое число функцией StringGetChar, а потом число может быть преобразовано обратно в символ функцией CharToStr. А целочисленный массив можно будет инициализировать функцией ArrayInitialize.


Ну, я это и имел ввиду. Но ведь это полная засада получается. Идет сбор тиковой истории, по большому кол-ву инструментов. По трем ДЦ, в реале. Для этого отдельный комп выделяется. Задохнется комп и потери тиков будут.

 
Chen писал (а):
Ну, я это и имел ввиду. Но ведь это полная засада получается. Идет сбор тиковой истории, по большому кол-ву инструментов. По трем ДЦ, в реале. Для этого отдельный комп выделяется. Задохнется комп и потери тиков будут.
Пример навскидку привести не могу, но в моей программистской практике бывали такие случаи, когда, вроде бы, большой и не совсем логичный код работает намного быстрее компактного и логичного кода. Критерий истины здесь может быть только один - это практика. Не попробовав, утверждать нельзя.
 
KimIV:
Пример навскидку привести не могу, но в моей программистской практике бывали такие случаи, когда, вроде бы, большой и не совсем логичный код работает намного быстрее компактного и логичного кода. Критерий истины здесь может быть только один - это практика. Не попробовав, утверждать нельзя.
Собственно, объем и красота кода, насколько я понял, не обсуждается.
А быстродействие надо просто проверить (это Chen-у).