Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните с sizeof(), неверный размер выдает 
V
    Опции темы
12usver12
Дата 23.2.2009, 21:58 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: нет
Всего: 1



Почему в первом случае выдается в окошке 13(i = 13), а во втором 4(i = 4) ?, хотя по идее и во втором случае должно выдавать тоже 13
Код

#include "windows.h"
void MyFunc(char* buf);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine,
                     int nCmdShow)
{char buff[]= "Hello World!";
int i = sizeof(buff);
itoa(i,buff,10);
MessageBox(NULL,buff,"Message",MB_OK);
MyFunc(buff);
    return 0;
}

void MyFunc(char* buf)
{
char temp[5];
    int i = sizeof(buf);
    itoa(i,temp,10);
MessageBox(NULL,temp,"Message",MB_OK);
}

PM MAIL   Вверх
Cтpaнник
Дата 23.2.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 12.10.2008
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



В первом случае, buff - это константный строковый литерал размером 13 (12 значащих символов + завершающий 0). Во втором случае, buf - это аргумент функции, указатель (на i32 размером 4). Все правильно показывает smile
PM MAIL   Вверх
ИванМ
Дата 23.2.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Потому что в первом случае вычисляется размер массива, а во втором - указателя.
PM MAIL   Вверх
12usver12
Дата 23.2.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: нет
Всего: 1



хорошо, как мне в функции узнать размер буфера по его char* указателю buf при передачи параметра ? то есть выйти на это число 13 в функции 
PM MAIL   Вверх
Soah
Дата 23.2.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 6
Всего: 54



Код

#include <string>

strlen(buf); // 12
// strlen(buf)+1; // 13


Это сообщение отредактировал(а) Soah - 23.2.2009, 23:24
PM MAIL   Вверх
12usver12
Дата 23.2.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: нет
Всего: 1



нет не пойдет strlen у меня будут нулевые символы '\0', в том то и дело... не хотелось бы создавать еще один доп параметр чтобы передавать в функцию.
поехали дальше  smile 
PM MAIL   Вверх
cutwater
Дата 24.2.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



Так у вас buff и так содержит нулевой символ.

Добавлено @ 00:04
Или как Вы думаете тот же MessageBox определяет длину Вашей строки???
Советую внимательно изучить документацию по работе со строками и учебник по С/С++

Добавлено @ 00:06
Цитата(Soah @  23.2.2009,  22:23 Найти цитируемый пост)
#include <string>


Не прав. string - содержит описание std::basic_string<> и std::string и иже с ними

либо
#include <cstring> // С++
либо 
#include <string> // C и C++

Это сообщение отредактировал(а) cutwater - 24.2.2009, 00:07


--------------------
user posted image
PM MAIL   Вверх
12usver12
Дата 24.2.2009, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: нет
Всего: 1



да нет же не правильно меня поняли или я неправильно выразился, основы с++ я давно уже выучил, мне это нужно для более сложной операции чем показывать окошко hello world  smile 
поменяем 
char buff[]="\x4d\x45\x0f\x00\x23\x2b"; strlen - покажет в этом случае 3, а мне в функции нужно оперировать числом 6  - колво символов или размерность буфера который передается параметром, чтобы перебрать все символы в буфере...а если не подключать string или не передавать доп параметром размерность буфера ?
PM MAIL   Вверх
jonie
Дата 24.2.2009, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



типа такого чтоли?
Код

char buff[]="\x4d\x45\x0f\x00\x23\x2b"
....
void CheckForNumeric(char* p) {
 while(*p) {
  if(*p<'0' || *p>'9') return false;
  ++p;
 }
 return true;
}



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Soah
Дата 24.2.2009, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 6
Всего: 54



можно присвоить размерность первому элементу, если размерность не превысит 255.
PM MAIL   Вверх
cutwater
Дата 24.2.2009, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



12usver12, Вы неправильно выразились.
Для этого лучше всетаки передавать 2 параметром длинну строки. это нормальный, человеческий способ.
либо завернуть в структуру.

Все остальное извращения или под конкретные задачи.
То что я описал - общепринятые способы работы с двоичными строками(даже в стандартной библиотеке)
Необходимо ЯВНО указывать размер строки. По указателю никак не определить.

Добавлено через 23 секунды
Soah, это из рода извращений уже ИМХО

Добавлено через 1 минуту и 7 секунд
Цитата(jonie @  23.2.2009,  23:29 Найти цитируемый пост)
типа такого чтоли?

Отработает до первого нуля в строке.


--------------------
user posted image
PM MAIL   Вверх
Dov
Дата 24.2.2009, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Код
template <class T, int size>
void MyFunc(T (&buf)[size])
{    
    std::cout << sizeof buf << endl;
}

int main()
{    
    char buff[]     = "Hello World!";
    char buff2[255] = "Hello World!";
    MyFunc(buff);   //  13
    MyFunc(buff2);  //  255

    
    return 0;
}


Это сообщение отредактировал(а) Dov - 24.2.2009, 02:18


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Dov
Дата 24.2.2009, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Наверное,  так  будет лучше:
Код
template <class T, int size>
void MyFunc(T (&buf)[size])
{    
    std::cout << sizeof buf / sizeof T << endl;
}

int main()
{    
    char buff []     = "Hello World!";
    char buff2[255]  = "Hello World!";
    int  num  []     = {1,2,3,4,5,6,7,8,9};
    int  num2 [44]   = {1,2,3,4,5,6,7,8,9};

    MyFunc(buff);   //  13
    MyFunc(buff2);  //  255
    MyFunc(num);    //  9
    MyFunc(num2);   //  44
    // ...

    return 0;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
12usver12
Дата 24.2.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: нет
Всего: 1



спасибо всем, особенно Dov, хотя наверно для эстетики придется еще один доп параметр вводить 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0928 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.