powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Проблемы с вход. и выход. массивами в Си
10 сообщений из 10, страница 1 из 1
Проблемы с вход. и выход. массивами в Си
    #35343558
DanilSoldatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет господа програмисты!

Вопрос наверное очень глупый но тем не менее...для меня это вопрос:)
Есть функция с входным массивом aData и выходным outData, которая берет размер aStrLen из массива aData и по нему копирует данные в выходной массив outData

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
WORD StrFromArray( char *aData, int len, const int aFromPos, char *outData)
{
  WORD aStrLen;
 
  aStrLen = WordFromArray(aData, aFromPos);
 
  memset( outData,  0 , aStrLen);
  for ( int i = aFromPos +  2 ; i <= aFromPos + aStrLen +  1 ; i++ )
  {
        DBG_PutS(aData[i]);           //функция для дебага
	outData[i - aFromPos -  2 ] = aData[i]; // просто присваиваю элемент массива aData элементу outData
	DBG_PutS(outData[i - aFromPos -  2 ]);
  }

  return aStrLen;
}

Вызываю так:
char *vResultBuf, *aErrorMessage;
StrFromArray(vResultBuf, strlen(vResultBuf),  19 , aErrorMessage);

а в дебаге вижу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
aData[ 21 ] =  205  

outData[ 0 ] =  0  

aData[ 22 ] =  229  

outData[ 1 ] =  0  

aData[ 23 ] =  229  

outData[ 2 ] =  59  

aData[ 24 ] =  238  

outData[ 3 ] =  32  
и т.д

Т.е. я явно в цикле присваиваю элементу одного массива элемент другого, а в дебаге вижу, что элементы outData и aData отличаются
И мало того: массив outData я обнуляю перед циклом, а он не нулевой (как это видно в дебаге). Как это можно объяснить?
...
Рейтинг: 0 / 0
Проблемы с вход. и выход. массивами в Си
    #35343873
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DanilSoldatovа в дебаге вижуэто ещё следует привязать к моменту времени.
...
Рейтинг: 0 / 0
Проблемы с вход. и выход. массивами в Си
    #35344622
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 DanilSoldatov:

DanilSoldatov
Вызываю так:
Код: plaintext
1.
2.
char *vResultBuf, *aErrorMessage;
StrFromArray(vResultBuf, strlen(vResultBuf),  19 , aErrorMessage);

А Вы что, не инициализируете указатели vResultBuf и aErrorMessage?

DanilSoldatov
И мало того: массив outData я обнуляю перед циклом, а он не нулевой (как это видно в дебаге). Как это можно объяснить?

Так Вы же сначала изменяете элемент массива, на который указывает outData, а потом выводите этот элемент:
DanilSoldatov
Код: plaintext
1.
2.
	outData[i - aFromPos -  2 ] = aData; // просто присваиваю элемент массива aData элементу outData
	DBG_PutS(outData[i - aFromPos -  2 ]);

С чего бы ему быть нулевым?

Лучше напишите, [i]что
Вы хотите сделать, а уж Вам подскажут, как это лучше сделать.
...
Рейтинг: 0 / 0
Проблемы с вход. и выход. массивами в Си
    #35345220
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очевидно, он хочет десериализовать строку из массива байтов :)
...
Рейтинг: 0 / 0
Проблемы с вход. и выход. массивами в Си
    #35346697
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 maXmo:
maXmoочевидно, он хочет десериализовать строку из массива байтов :)
Мне из этого кода ничего не очевидно :). Насколько я понял, DanilSoldatov пытается parse-ить текст со словами, причём слова ему нужны без первых двух знаков.

2 DanilSoldatov:
Если я прав, попробуйте так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
#include <assert.h>
#include <string>

using namespace std;

struct Stream
{
  const char* pText; // не обязательно завершается нулём
  int Len;
  int Pos;
};

inline bool IsSpace(char c)
{
  return (c == ' ') || (c == '\t') || (c == '\r') || (c == '\n');
}

void SkipSpaces(Stream* pStream)
{
  const char* pText = pStream->pText;
  int Len = pStream->Len;
  int Pos = pStream->Pos;
  assert(Len >=  0 );
  assert(( 0  <= Pos) && (Pos <= Len));
  while ((Pos < Len) && IsSpace(pText[Pos]))
  {
    Pos++;
  }
  pStream->Pos = Pos;
}

// возвращает true <=> c - английская буква или цифра
inline bool IsWordChar(char c)
{
  return (('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z')) || (('0' <= c) && (c <= '9'));
}

string ScanWord(Stream* pStream)
{
  const char* pText = pStream->pText;
  int Len = pStream->Len;
  int Pos = pStream->Pos;
  assert(Len >=  0 );
  assert(( 0  <= Pos) && (Pos <= Len));
  int WordPos = Pos;
  while ((Pos < Len) && IsWordChar(pText[Pos]))
  {
    Pos++;
  }
  int WordLen = Pos - WordPos;
  if (WordLen <=  2 )
  {
    throw runtime_error("Cannot scan word."); // аварийное завершение
  }
  pStream->Pos = Pos;
  return string(pText + WordPos +  2 , WordLen -  2 ); // пропустить первые два знака
}

void Test()
{
  Stream s;
  s.pText = "word1 word2 \t word3";
  s.Len = strlen(s.pText);
  s.Pos =  0 ;

  string w1 = ScanWord(&s);
  assert(w1 == "rd1");
  SkipSpaces(&s);

  string w2 = ScanWord(&s);
  assert(w2 == "rd2");
  SkipSpaces(&s);

  string w3 = ScanWord(&s);
  assert(w3 == "rd3");

  assert(s.Pos == s.Len); // конец
}
std::string -- не лучший строковый класс, но для casual-ного использования сойдёт.
...
Рейтинг: 0 / 0
Проблемы с вход. и выход. массивами в Си
    #35348450
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WORD – это конечно слово, да не то.
...
Рейтинг: 0 / 0
Проблемы с вход. и выход. массивами в Си
    #35348454
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мораль: С++ разлагает моск
...
Рейтинг: 0 / 0
Проблемы с вход. и выход. массивами в Си
    #35349995
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 maXmo:

maXmoWORD – это конечно слово, да не то.
Я понял так, что DanilSoldatov пытается parse-ить текст вроде:
Код: plaintext
H1word1 H2word2 H1word3
и вот эти «H1» ему не нужны. Если я прав, то слово «word» вполне уместно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void Test2()
{
  Stream s;
  s.pText = "H1word1 H2word2 H1word3";
  s.Len = strlen(s.pText);
  s.Pos =  0 ;

  string w1 = ScanWord(&s);
  assert(w1 == "word1");
  SkipSpaces(&s);

  string w2 = ScanWord(&s);
  assert(w2 == "word2");
  SkipSpaces(&s);

  string w3 = ScanWord(&s);
  assert(w3 == "word3");

  assert(s.Pos == s.Len); // конец
}

maXmoмораль: С++ разлагает моск
Смайлик -- в честь того, что это шутка?
...
Рейтинг: 0 / 0
Проблемы с вход. и выход. массивами в Си
    #35350573
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Проблемы с вход. и выход. массивами в Си
    #35351232
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 maXmo:
maXmo чтение на ночь для профилактики разложения моска
А причём здесь C++? Из этой статьи вроде не следует, что «C++ разлагает моск».
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Проблемы с вход. и выход. массивами в Си
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]