Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2010, 12:48   #21
Gradus
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 35
По умолчанию

пишем слово, программа пишет слово в обратную сторону и скажет размер массива
Код:
for(int i=0;i<max;i++) тогда уже
если я так сделаю он только одну букву напишет.
Суть в том что как бы массив не увеличивать, sizeof говорит размер указаный при создании массива.Извеняюсь код кривой выложил не посмотрел)))
Код:
#pragma hdrstop
#include <iostream>

using namespace std;

#pragma argsused
int main(int argc, char* argv[])
{
char mas[1];
int max,size;
char exit;
scanf("%s",mas);

size=sizeof(mas);
printf("array size=%d\n",size);

for(int i=0;mas[i];i++)
max=i;

while(max>=0)
{
	cout << mas[max];
	max--;
	}
	
        cin >> exit;
        return 0;
}
Gradus вне форума Ответить с цитированием
Старый 23.08.2010, 14:09   #22
Kill-All-N-Thrash
Пользователь
 
Аватар для Kill-All-N-Thrash
 
Регистрация: 28.07.2010
Сообщений: 43
По умолчанию

А, да, я ошибся - не учёл, что в случае массивов символов sizeof даёт размер, и в цикле проверку на нулевой символ. Всё таки я не понимаю одного, хоть и всё работать должно, почему такой способ сложный, я-бы сказал, странноватый?
Kill-All-N-Thrash вне форума Ответить с цитированием
Старый 23.08.2010, 14:53   #23
Gradus
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 35
По умолчанию

Цитата:
и в цикле проверку на нулевой символ
это где ? как я предполагаю цикл идёт пока ключи массива не кончаться
Цитата:
почему такой способ сложный, я-бы сказал, странноватый
я пришёл с php,в c++ очень мало знаю, поэтому незная функций пишу код на минимальном знании

так всё таки почему sizeof так врёт ?)
Gradus вне форума Ответить с цитированием
Старый 23.08.2010, 14:59   #24
Kill-All-N-Thrash
Пользователь
 
Аватар для Kill-All-N-Thrash
 
Регистрация: 28.07.2010
Сообщений: 43
По умолчанию

нет, погоди, sizeof не врёт. Массив статический, нельзя изменить его размер. Какой создал - такой и до конца.
Kill-All-N-Thrash вне форума Ответить с цитированием
Старый 23.08.2010, 15:15   #25
Gradus
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 35
По умолчанию

char mas[1]; // говорим что массив будет с 1 элементом
дальше если пишем слово "привет",то массив увеличивается по идее
mas[0]='п';
mas[1]='р';
mas[2]='и';
mas[3]='в';
mas[4]='е';
mas[5]='т';
но sizeof всё равно говорит что массив с 1 элементом
Gradus вне форума Ответить с цитированием
Старый 23.08.2010, 15:25   #26
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Правильно, было выделено памяти для одного элемента (поэтому sizeof и пишет 1), а все остальное уже выход за предел массива. Если компилятор не увидел ошибки, ошибка может выявиться в любом месте программы и найти ее будет непросто.
Та область где содержатся "ривет" считается свободной, поэтому она может использоваться в других целях. Допустим, выделяем память где-нибудь в другой части программы, эта область может выбелиться для другой переменной, а после этого обращение к mas[2] будет уже недоступно
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 23.08.2010, 15:30   #27
sever-42
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 96
По умолчанию

Правильно, потому что размер массива задается во время компиляции, и дальше его изменить нельзя.
include <Qt>
sever-42 вне форума Ответить с цитированием
Старый 24.08.2010, 19:48   #28
Gradus
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 35
По умолчанию

блин ну и c++ путаниться
пример из книги:
Код:
#include <iostream>

using namespace std;

void convert(char *s)
{
while (*s !='\0')
  {
if(*s >= 'a' && *s <= 'z')
*s-=32;
s=s+1;
 }

}

void convert(char *);

int main(int argc, char* argv[])
{

int i;
char string[]="characters";

convert(string);
cout << string;
cin >>i;
return 0;
}
это вообще как так то ? while (*s !='\0') и s=s+1; не могу как они вообще смогли сработать.
s- ведь массив, по идее строка while (*s !='\0') говорит пока массив (то-есть весь массива не его элемент) не будет иметь значения \0 и дальше в функции "*s" не массив а как будто его элемент, почему он вообще ошибку не выдал как так...
далее....
s=s+1; - тут вообще что за ерунда, ради интереса проверил cout << s; выдал тоже символ (я запутался) ну и каким то чудесным образом не символ изменяеться на +1 , а переходим к следущему элементу *s!
не понятно.....!!!!!!!!!
Gradus вне форума Ответить с цитированием
Старый 24.08.2010, 20:10   #29
Kill-All-N-Thrash
Пользователь
 
Аватар для Kill-All-N-Thrash
 
Регистрация: 28.07.2010
Сообщений: 43
По умолчанию

Что тут непонятного? s - это массив. Имя массива является указателем, в данном случае указателем на char, тобиш на символ. Далее, строка в с - это последовательность символов, заканчивающаяся нулевым символом (символ с кодом 0 - нуль-терминатор), записывается символ нулевой так '\0' или просто 0 без кавычек, поэтому цикл и работает.
в случае указателей операции инкремента, декремента, а так-же сложения и вычитания работают так: прибавление к указателю числа сдвигает его на это число размеров типа, на который указвает указатель , то есть на количество элементов массива.
*s - это разыменованный указатель, то есть то, что хранится по указанному адресу, указатель тут на чар, следовательно и лежит там символ, дальше указатель сдвигается на один элемент вправо и цикл повторяется.
Kill-All-N-Thrash вне форума Ответить с цитированием
Старый 24.08.2010, 20:28   #30
sever-42
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 96
По умолчанию

Почитайте Керниган & Ричи.
include <Qt>
sever-42 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
rand в С Jasper92 Общие вопросы C/C++ 1 02.04.2010 16:01
rand VAN32 Общие вопросы C/C++ 5 07.03.2010 21:38
SizeOf выдает значение на порядок меньше. Alex Cones Общие вопросы Delphi 4 15.01.2010 21:24
rand() ????? Revenholm Общие вопросы C/C++ 7 25.04.2009 18:47
как узнать ip адрес зная mac адрес Roman Работа с сетью в Delphi 9 25.06.2007 12:39