Постійний збір на дрони FPV для ЗСУ
Закидуй дві гривні!
FPV-дрони змінюють хід війни
Змінюй хід війни!

помогите по C+, пожалуйста

🔴 02:28 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 11.06.2012
Повідом.: 175
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #1
помогите по C+, пожалуйста

Вопрос следующий.

Создаю переменную типа char и хочу приисвоить ей значение элемента структуры obj1->line. Делаю так:
...
char line1[length];
line1 = obj->line;
...
получаю ошибку: incompatible types when assigning to type «char[4096]» from type «char * const»

при том, что если просто выводить на печать
printf("%s\n", obj1->line);
то выводится строка как есть.

как мне присвоить переменной line1 строку, которая содержится в obj->line?
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #2
Вопрос следующий.

Создаю переменную типа char и хочу приисвоить ей значение элемента структуры obj1->line. Делаю так:
...
char line1[length];
line1 = obj->line;
...
получаю ошибку: incompatible types when assigning to type «char[4096]» from type «char * const»

при том, что если просто выводить на печать
printf("%s\n", obj1->line);
то выводится строка как есть.

как мне присвоить переменной line1 строку, которая содержится в obj->line?



typedef struct {
char line[20];
int data;
}testStruct;

.....

int main (void){

char line1[20] = { 0 };
testStruct obj;
....

sprintf_s(obj.line, "Hello World!");
memcpy(line1, obj.line, sizeof(line1));
cout << line1 << endl;

.....
while(1);
return 0;
}
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #3
Вопрос следующий.

Создаю переменную типа char и хочу приисвоить ей значение элемента структуры obj1->line. Делаю так:
...
char line1[length];
line1 = obj->line;
...
получаю ошибку: incompatible types when assigning to type «char[4096]» from type «char * const»

при том, что если просто выводить на печать
printf("%s\n", obj1->line);
то выводится строка как есть.

как мне присвоить переменной line1 строку, которая содержится в obj->line?


Если используется указатель:

testStruct obj;
testStruct *pObj;
pObj = &obj;

sprintf_s(pObj->line, "Hello World!");
memcpy(line1, pObj->line, sizeof(line1));

cout << line1 << endl;
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #4
Забыл сказать.
При динамическом выделении памяти не забывайте использовать strlen.
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #5
:рл: Эпичный



Вопрос следующий.

Создаю переменную типа char и хочу приисвоить ей значение элемента структуры obj1->line. Делаю так:
...
char line1[length];
line1 = obj->line;
...
получаю ошибку: incompatible types when assigning to type «char[4096]» from type «char * const»

при том, что если просто выводить на печать
printf("%s\n", obj1->line);
то выводится строка как есть.

как мне присвоить переменной line1 строку, которая содержится в obj->line?

И где же вас не доучили тому что в ни в С ни в С++ нет нативного строкового типа?
Есть только указаталеь.
В частности указатель может указывать на массив, частным случаем которого есть строка.
Посему если вас интересует С++ то надо использовать std::string, если С - strcpy(line1, obj->line), если быть совсем точным и безопасным strncpy(line1, obj->line, length - 1), или есть желание изобрести велосипед, то while (*line1++ = *obj->line++); толкьо это сдвинет указатели на конец строк, посему строкой выше надо их поприсваивать временным переменным и копировать с их помощью.

typedef struct {
char line[20];
int data;
}testStruct;

.....

int main (void){

char line1[20] = { 0 };
testStruct obj;
....

sprintf_s(obj.line, "Hello World!");
memcpy(line1, obj.line, sizeof(line1));
cout << line1 << endl;

.....
while(1);
return 0;
}

Какой кошмар... И где такому учат?

Если используется указатель:

testStruct obj;
testStruct *pObj;
pObj = &obj;

sprintf_s(pObj->line, "Hello World!");
memcpy(line1, pObj->line, sizeof(line1));

cout << line1 << endl;

И этот ОМГ - туда же.

Забыл сказать.
При динамическом выделении памяти не забывайте использовать strlen.

А при выдилении не стеке не надо?
 
Останнє редагування:
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #6
Не все такие умные как вы, lugal... что ж поделаешь. :-)
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #7
Не все такие умные как вы, lugal... что ж поделаешь. :-)

Я не умный, я только учусь :)
А вообще на лицо непонимание фундаментальных основ языка. Без них дальше никуда.



З.Ы. Хста забыл дописать... Но по всей видимости надо :)
Опосля ентого strncpy(line1, obj->line, length - 1) надо писать от так:
line1[ length - 1] = '\0';
 
Останнє редагування:
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #8
Спасибо, lugal, мне помог ответ RUH, stmcpy я пробовала, тоже ошибка возникла. memcpy сработало, и теперь все нормально. Можно больше не писать сюда :-)
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #9
Я не умный, я только учусь :)
А вообще на лицо непонимание фундаментальных основ языка. Без них дальше никуда.



З.Ы. Хста забыл дописать... Но по всей видимости надо :)
Опосля ентого strncpy(line1, obj->line, length - 1) надо писать от так:
line1[ length - 1] = '\0';

Ты бы повежлевее был, и к тебе бы потянулись люди.

То, чем конкретно человек интересовался, то ему и было показано..
Показано откуда вобще берется указатель, который он пытается использовать (Понятно, что объявлять переменную структурного типа и тут же указатель на нее бессмысллица).
О "string", явно, тоже никто не спрашивал, кстати.
Тут куча вариантов решения задачи, и выбран самый простой и наглядный.

Ты сначала разберись, а потом будь таким "резким".
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #10
Спасибо, lugal, мне помог ответ RUH, stmcpy я пробовала, тоже ошибка возникла. memcpy сработало, и теперь все нормально. Можно больше не писать сюда :-)

Ну дело ваше, можете использовать и дальше ерись с memcpy :) Жизнь научит крашами использовать stmcpy :)
А что за ошибка кстате?
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #11
Ну дело ваше, можете использовать и дальше ерись с memcpy :) Жизнь научит крашами использовать stmcpy :)
А что за ошибка кстате?

Вангую, что компейлятор не находил функцию stmcpy :)
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #12
Ты бы повежлевее был, и к тебе бы потянулись люди.

То, чем конкретно человек интересовался, то ему и было показано..
Показано откуда вобще берется указатель, который он пытается использовать (Понятно, что объявлять переменную структурного типа и тут же указатель на нее бессмысллица).
О "string", явно, тоже никто не спрашивал, кстати.
Тут куча вариантов решения задачи, и выбран самый простой и наглядный.

Ты сначала разберись, а потом будь таким "резким".

А не то что? :D
За ерись с memcpy в средние века отдали бы под суд инквизиции :)
Что такое sprintf_s? Почему тогда не memcpy_s? Почему не strcpy_s или sprintf_s дважды? Это не код, а ужасное рагу. С таким же успехом можно было закастить С стайлом и все бы работало до поры до времени.

З.Ы. Если человек спрашивает о С++ (так как я не понимаю что такое С+) то там вообще не должно в коде быть никаких стековых или динамических массивов и указателей не строки - исключительно std::string.

Вангую, что компейлятор не находил функцию stmcpy :)

:D Я бы ее тоже не нашел на его месте :)

Вангую, что компейлятор не находил функцию stmcpy :)

З.Ы. Хстате коллега, известна ли вам хоть одна книга по си или плюсам, даже от самых дешевых парнокопытных россейских гуру (коими в свое время была завалена уся балка) где в первой, максимум второй главе не обсуждается работа с С-style строками и очень болшими буква не сказано что С-style строки присваивать нельзя напрямую?
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #13
А не то что? :D
За ерись с memcpy в средние века отдали бы под суд инквизиции :)
Что такое sprintf_s? Почему тогда не memcpy_s? Почему не strcpy_s или sprintf_s дважды? Это не код, а ужасное рагу. С таким же успехом можно было закастить С стайлом и все бы работало до поры до времени.

З.Ы. Если человек спрашивает о С++ (так как я не понимаю что такое С+) то там вообще не должно в коде быть никаких стековых или динамических массивов и указателей не строки - исключительно std::string.

Знаешь, я буду умнее, и перестану тебя комментировать. :) ;)
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #15
а разве все функции strxxx не дописывают сами нуль в конце результата?
на сколько я понял их отличие от memcpy, в том что копирование идет до первого нулевого байта.
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #16
а разве все функции strxxx не дописывают сами нуль в конце результата?
на сколько я понял их отличие от memcpy, в том что копирование идет до первого нулевого байта.

не все и не всегда. Почитай референс по strncpy.
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #17
да действительно. а еще печально что нет оптимизации на ассемблере, я думал там используются потоковые команды процессора, а оказывается тупое копирование побайтно.
 
  • 🔴 02:28 Повітряна тривога в Харків.обл.
  • #18
да действительно. а еще печально что нет оптимизации на ассемблере, я думал там используются потоковые команды процессора, а оказывается тупое копирование побайтно.

У кого? И в каком режиме компиляции? string.h меня как то мало интересовал, я смотрел листинги math.h - там нередко сложые вычисления делаются одной инструкцией.
 
Назад
Зверху Знизу