forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Вопрос-Ответ (http://forum.boolean.name/showthread.php?t=16032)

Nerd 13.12.2011 22:45

Вопрос-Ответ
 
В коде:
Код:

const char tmp_adr[]="../dat/gfx/menu_0.png";
Что вижу при отладке на этой строчке:
Код:

tmp_adr[22] - "ММММММММ../dat/gfx/men"
wtf?
Юзаю msvs11.

SBJoker 13.12.2011 23:11

Ответ: Вопрос-Ответ
 
ты залез на память по смещению +22 от начала своей строки

Nerd 13.12.2011 23:29

Ответ: Вопрос-Ответ
 
Цитата:

Сообщение от SBJoker (Сообщение 213871)
ты залез на память по смещению +22 от начала своей строки

Всмысле? Мне это значение даёт дебаггер.

SBJoker 14.12.2011 00:45

Ответ: Вопрос-Ответ
 
Последняя буква у тебя с номером 20, потом ноль, потом мусор.
tmp_adr[22] - доступ к мусору позади строки.
Почему дебагер выдаёт строку трудно сказать должен быть чар.

Nerd 14.12.2011 01:25

Ответ: Вопрос-Ответ
 
Я ошибся - значение сначала присваивается нормально, потом:
im_f_t = hge->LoadTexture(tmp_adr);
И вот тут движок hge вылетает, а в дебаге строка забита мусором.
Со стандартными примерами hge тоже самое, так что проблема была в нём.

HolyDel 14.12.2011 01:51

Ответ: Вопрос-Ответ
 
дебаггер выдает строку потомучто ето массив из 22 чаров, а не 22-й чар.

почему то портится память в hge->LoadTexture(tmp_adr);

pozitiffcat 14.12.2011 09:27

Ответ: Вопрос-Ответ
 
char* tmp_adr = "mytexture.jpg";
im_f_t = hge->LoadTexture(tmp_adr);
так тоже валится?
или так, смотря че ты там со строкой вытворяешь перед загрузкой..
char *oldname="texture.jpg";
char *newname = new char[strlen(oldname)+1];
strcpy(newname, oldname);
im_f_t = hge->LoadTexture(newname);
или так
char name[255];
sprintf(name,"%s.jpg","texture");//на выходе texture.jpg (динамическое создавание имени файла типа)

.Squid 14.12.2011 12:45

Ответ: Вопрос-Ответ
 
Цитата:

Сообщение от Nerd96 (Сообщение 213867)
Юзаю msvs11.

Ну дык юзай официальные 2003, 2005, 2008, 2010 и не будет проблем *trollface*

impersonalis 14.12.2011 15:46

Ответ: Вопрос-Ответ
 
Цитата:

Сообщение от pozitiffcat (Сообщение 213909)
char* tmp_adr = "mytexture.jpg";
im_f_t = hge->LoadTexture(tmp_adr);
так тоже валится?
или так, смотря че ты там со строкой вытворяешь перед загрузкой..
char *oldname="texture.jpg";
char *newname = new char[strlen(oldname)];
strcpy(newname, oldname);
im_f_t = hge->LoadTexture(newname);
или так
char name[255];
sprintf(name,"%s.jpg","texture");//на выходе texture.jpg (динамическое создавание имени файла типа)

Код:

char *newname = new char[strlen(oldname)+1];

pozitiffcat 15.12.2011 09:37

Ответ: Вопрос-Ответ
 
Цитата:

Сообщение от impersonalis (Сообщение 213930)


Код:

char *newname = new char[strlen(oldname)+1];

ах точно, забыл про нуль!

Nerd 06.06.2012 18:55

Ответ: Вопрос-Ответ
 
Поссоны, кто-нибудь сталкивался с ошибкой инклуда sdl в tcc?
Код:

In file included from D:/Dev/sdl/SDL-1.2.15/test/testwin.c:12:
In file included from ../include/SDL/SDL.h:30:
In file included from ../include/SDL/SDL_main.h:26:
In file included from ../include/SDL/SDL_stdinc.h:155:
../include/SDL/begin_code.h:86: #endif without matching #if

Нашёл ещё сборку sdl специально под tcc, но она тоже не компилится.

Spy4433 07.06.2012 00:49

Ответ: Вопрос-Ответ
 
мтак и снова проблема...
нужно разделить определенную строку на слова входящая строка string

ни как не могу написать разделение :) сам алгаритм известен но доступ к частицам строки организовать не получается с char тож самое кому не лень
киньте пример как лучше все это забацать желательно с коментами

строка =
Код:

man{0,1,2,3}
получить в итоге нужно
man
0
1
2
3
т.е не по одному символу разделять а n
в данном случае
{
}
,

Жека 07.06.2012 09:42

Ответ: Вопрос-Ответ
 
На счёт "лучше всего" - вопрос не ко мне. Но я вот как делаю на примере с++ билдера:

Код:

//функция
TStringList* SplitString(const String s, const char *razd) {
        TStringList *list = new TStringList();
        if(razd == NULL) {//если разделители не указаны, то возвращаем исходную строку
                list->Add(s);
                return list;
        }
        int len = s.Length();
        String tmp = "";
        bool bRazd;
        //пробегаем побуквенно по строке
        for(int k=1;k<=len;++k) {
                bRazd = false;
                for(int j=0;razd[j] != NULL;++j) {//проверка не является ли текущий символ разделителем
                        if(s[k] == razd[j]) {
                                bRazd = true;
                                break;
            }
                }
                if(bRazd == true && tmp != "") { //если разделитель, то предыдущее набранное из букв слово добавляем в список
                        list->Add(tmp);
                        tmp = "";
                }
                else { //иначе набираем слово побуквенно
                        tmp += s[k];
                }
                if(k == len && tmp != "") //если достигли последнего символа, то последнее слово тоже в список добавляем
                list->Add(tmp);
        }
        return list;
}

//использоваие
String s = "man{1,2,3,4}";
char razd[] = {'{','}',',',' '};
TStringList *lst = fnSplitString(s, razd);
for(int k=0;k<lst->Count;++k) {
        ShowMessage(lst->Strings[k]);
}
delete lst; //необязательно, должно удалиться при выходе из области видимости


jimon 07.06.2012 12:46

Ответ: Вопрос-Ответ
 
Цитата:

ни как не могу написать разделение :) сам алгаритм известен но доступ к частицам строки организовать не получается с char тож самое кому не лень
киньте пример как лучше все это забацать желательно с коментами
http://www.cplusplus.com/reference/c...string/strtok/

Код:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="man{0,1,2,3}";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str,"{},");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, "{},");
  }
  return 0;
}

запустим ка код http://ideone.com/Mqn65

Цитата:

Splitting string "man{0,1,2,3}" into tokens:
man
0
1
2
3
Цитата:

delete lst; //необязательно, должно удалиться при выходе из области видимости
хм, в цпп билдере есть сборщик мусора ? память в хипе сама не удаляется :) (на стеке удаляется)

jimon 07.06.2012 19:39

Ответ: Вопрос-Ответ
 
http://ideone.com/ttYDS

Цитата:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
char str[] ="man{0,1,2,3}\nmanman";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str,"{},\n");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, "{},\n");
}
return 0;
}


Часовой пояс GMT +4, время: 08:49.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot