Есть желание научиться создавать устройства на МК.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: вопросы полного чайника

Сообщение YS »

Завели одну переменную под символ и восемь строк по 50 символов. Того же можно было добиться, написав

Код: Выделить всё

char ch;
char strN[8][50];
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Sam85
Встал на лапы
Сообщения: 86
Зарегистрирован: Пт янв 21, 2011 07:48:23

Re: вопросы полного чайника

Сообщение Sam85 »

YS писал(а):Завели одну переменную под символ и восемь строк по 50 символов. Того же можно было добиться, написав

Код: Выделить всё

char ch;
char strN[8][50];


чет ругается на такую форму записи :(
расписал по строкам и ругань прошла, в чем может быть дело ?

Код: Выделить всё

char str0[50];
char str1[50];
char str2[50];
char str3[50];
char str4[50];
char str5[50];
char str6[50];
char str7[50];
char str8[50];
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: вопросы полного чайника

Сообщение menzoda »

Sam85 писал(а):чет ругается на такую форму записи

Надо же писать как ругается. Да и вообще, в сообщении об ошибке обычно есть вся нужная информация для устранения ошибки, если нет - то вбиваешь в поисковик и читаешь, что пишут. Могу сказать, что умение внимательно читать - решает 99% проблем.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: вопросы полного чайника

Сообщение ARV »

menzoda писал(а):
Sam85 писал(а):чет ругается на такую форму записи

Надо же писать как ругается.

Error in lines from 1 to 123: programmer does not understand anything, must be replaced.
шютка :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: вопросы полного чайника

Сообщение menzoda »

Ага. Как там говорят? Обычно, проблема заключается в интерфейсе между креслом и клавиатурой.
Аватара пользователя
Sam85
Встал на лапы
Сообщения: 86
Зарегистрирован: Пт янв 21, 2011 07:48:23

Re: вопросы полного чайника

Сообщение Sam85 »

menzoda писал(а):
Sam85 писал(а):чет ругается на такую форму записи

Надо же писать как ругается. Да и вообще, в сообщении об ошибке обычно есть вся нужная информация для устранения ошибки, если нет - то вбиваешь в поисковик и читаешь, что пишут. Могу сказать, что умение внимательно читать - решает 99% проблем.

[C++ Error] Unit1.cpp(11): E2451 Undefined symbol 'str1' вот так и ругаеться
вот код
Спойлер

Код: Выделить всё

#include <windows.h>
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#pragma argsused
main()
{
char ch;
char strN [8] [50];
CharToOem("Àíäðååâ\n", str1);
CharToOem("Áîðèñîâ\n", str2);
CharToOem("Âèíîãðàäîâ\n", str3);
CharToOem("Ãîãîëü\n", str4);
CharToOem("Äàíèëîâ\n", str5);
CharToOem("\n", str6);
CharToOem("Æåëåçíîâ\n", str7);
CharToOem("Çëîâ\n", str8);
printf(str0);
ch=getchar();
if(ch>='A'&&ch<='Z')
switch(ch)
   {
case'A':printf(str1);break;
case'B':printf(str2);break;
case'V':printf(str3);break;
case'G':printf(str4);break;
case'D':printf(str5);break;

   }

system("pause");
}

не объявлена или неправильно объявлена переменная str, как надо ?

Код: Выделить всё

if(ch>='A'&&ch<='Z')

эта строка читаеться примерно так "если переменная ch находиться в между A и Z" ?
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: вопросы полного чайника

Сообщение menzoda »

Все верно. Сначала ты объявил массив с именем strN, а потом пытаешся использовать какие-то str1. Нужно так:

Код: Выделить всё

char str[8][50];

CharToOem("Hello", str[0]);
CharToOem("World", str[1]);
...
CharToOem("Goodbye", str[7]);


В сообщении об ошибке это прямым текстом говорится: неизвестный символ str1. Неизвестный потому что ты нигде не объявил переменную с таким именем. А доступ к элементам массива осуществляется через специальный оператор (квадратные скобки), а не просто добавлением циферок к имени массива. Нумерация начинается с нуля.
Аватара пользователя
Sam85
Встал на лапы
Сообщения: 86
Зарегистрирован: Пт янв 21, 2011 07:48:23

Re: вопросы полного чайника

Сообщение Sam85 »

благодарю за объяснения :) а что по поводу нижеследующего куска кода ?

Код: Выделить всё

if(ch>='A'&&ch<='Z')

эта строка читаеться примерно так "если переменная ch находиться в между A и Z" ?
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: вопросы полного чайника

Сообщение menzoda »

Да, все так. Другими словами проверяется является ли ch заглавной латинской буквой.
Аватара пользователя
Sam85
Встал на лапы
Сообщения: 86
Зарегистрирован: Пт янв 21, 2011 07:48:23

Re: вопросы полного чайника

Сообщение Sam85 »

menzoda писал(а):Да, все так. Другими словами проверяется является ли ch заглавной латинской буквой.

А как обозначаются что именно заглавными ? и как выглядел бы код если бы не имело значения каким регистром вводить ?
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: вопросы полного чайника

Сообщение menzoda »

В данном случае эксплуатируется тот факт, что в используемой кодировке (стандарту по которому символ сопоставляется числовому коду) заглавные буквы расположены по алфавиту друг за другом. То есть, напирмер, символу 'A' соответствует код 65, символу 'B' - код 66, 'C' - код 67, и так далее до символа 'Z' с кодом 90. После заглавных букв идут строчные, так же в алфавитном порядке. Цифры тоже расположены по порядку, только в другом месте, перед заглавными буквами. Вот, можешь посмотреть табличку ASCII, почитай что это такое в википедии, почитай про различные кодировки, и что это такое - кодировка.

Ближе к делу. Имеем подряд идущие заглавные буквы, соответственно, если числовое значение переменной больше кода буквы 'A' и меньше кода буквы 'Z', то это значение является кодом какой-либо заглавной буквы. Компилятор подменяет выражения 'A' и 'Z' (которые являются символьными литералами) на соответствующие числа. Можно вместо символьных литералов явно указывать соответствующие им числа, если только ты точно знаешь с какой кодировкой работаешь.

Код: Выделить всё

if (ch >=65 && ch <= 90)


В заключении скажу, что этот трюк прокатит не всегда. С латинскими буквами обычно все хорошо, но буквы других языков могут следовать не по алфавиту и вообще не друг за другом. Использовать надо с осторожностью и пониманием.

как выглядел бы код если бы не имело значения каким регистром вводить?

В данном случае

Код: Выделить всё

if ((ch >= 'A' && ch <= 'Z') || (ch >='a' && ch <= 'z'))
Аватара пользователя
Sam85
Встал на лапы
Сообщения: 86
Зарегистрирован: Пт янв 21, 2011 07:48:23

Re: вопросы полного чайника

Сообщение Sam85 »

СпойлерИзображение

не скажете что за ошибка ? :( ей богу достала уже

Код: Выделить всё

#include <windows.h>
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#pragma argsused
main()
{
int numer;
char str[9][50];
CharToOem("введите цифру дня недели\n", str[0]);
CharToOem("Понедельник\n",str[1]);
CharToOem("Вторник\n", str[2]);
CharToOem("Среда\n", str[3]);
CharToOem("Четверг\n", str[4]);
CharToOem("Пятница\n", str[5]);
CharToOem("Суббота\n", str[6]);
CharToOem("Воскресенье\n", str[7]);
CharToOem("На такую цифру нет дня недели\n", str[8]);
CharToOem("Введите цифру, а не другой символ :)\n", str[9]);
printf(str[0]);
printf("\n");
scanf("%f", &numer);
if(numer>='1'&&numer<='7')
switch(numer)
   {
   case1:printf(str[1]);break;
   case2:printf(str[2]);break;
   case3:printf(str[3]);break;

   }

это часть кода, остальное еще не дописал
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: вопросы полного чайника

Сообщение menzoda »

Возможно из-за обращения к несуществующему элементу массива str[9]. Ведь он объявлен как char str[9][50], то есть массив из 9 строк, от нулевой до восьмой включительно. А тут вдруг к девятой обращаются, которая на самом деле уже десятая, отсчет то с нуля начинается. Надо объявить массив как char str[10][50].
Аватара пользователя
Sam85
Встал на лапы
Сообщения: 86
Зарегистрирован: Пт янв 21, 2011 07:48:23

Re: вопросы полного чайника

Сообщение Sam85 »

а почему при компиляции ошибку не выдает ? а выскакивает только когда запускается приложение, и тупо виснет, через диспетчер задач приходиться закрывать или это нормальное явление для борландС++ 6,0 ? :)
попробую подправить, погляжу что выйдет
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: вопросы полного чайника

Сообщение menzoda »

Компиляторы не отслеживают выход за границы массива, потому что в общем случае на этапе компиляции это сделать практически невозможно.
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Re: вопросы полного чайника

Сообщение kalobyte »

непонятно, зачем ты пишеш
Sam85 писал(а):CharToOem("Понедельник\n",str[1]);

у тебя массив, в который ты пихаеш набор букв, который ты воспринимаеш как строку
компутер не знает, что это строка, т.к. на конце массива нет символа \0, который обозначает конец строки
тебе нужно использовать строки и никакой оем там не нужен, используй юникод всегда
http://valera.asf.ru/cpp/book/c03_4_2.html
и если ты пишеш на с++, то используй плюсовые библиотеки <iostream>
а то у тебя файл цпп, а код сишный
тематические ответы только в форуме, в приват не пишите
Аватара пользователя
Sam85
Встал на лапы
Сообщения: 86
Зарегистрирован: Пт янв 21, 2011 07:48:23

Re: вопросы полного чайника

Сообщение Sam85 »

переведите пожалуйста эту строку :) на человеческий язык

Код: Выделить всё

if (c & 1) PORTB.4=1
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: вопросы полного чайника

Сообщение Аlex »

Скорее, такие вопросы нужно задавать в теме по Си :)
Строка означает - если 0-ой бит в переменной "с" равен единице, то установить четвёртый бит порта B.
Аватара пользователя
Sam85
Встал на лапы
Сообщения: 86
Зарегистрирован: Пт янв 21, 2011 07:48:23

Re: вопросы полного чайника

Сообщение Sam85 »

Да начинал с МК, но постепенно дошел до Си :)
Пошли вопросы :) почему именно 0-ой бит ? и как выглядела бы запись, если бы вместо 0-го бита мне нужен был бы 4-ый.
И не кинете ссылку, где можно почитать про логические и битовые операции, но только что бы было описано и разжевано, а то, то что находил сам в голове толком не укладывается :( и желательно с примерами
P.S. Только не гугл в помощь :) ?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: вопросы полного чайника

Сообщение Аlex »

почему именно 0-ой бит ?
Честно говоря, не знаем - код то не наш, и что задумывал автор - неизвестно :)

Sam85 писал(а):как выглядела бы запись, если бы вместо 0-го бита мне нужен был бы 4-ый.

Код: Выделить всё

if (c & 0x10)
или

Код: Выделить всё

if (c & (1<<4))
, что эквивалентно друг другу.

Sam85 писал(а):P.S. Только не гугл в помощь :) ?
Ну а почему бы и нет ? Вы пробовали ? :)
Ответить

Вернуться в «Разные вопросы по МК»