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;
}

Nerd 06.07.2012 22:23

Ответ: Вопрос-Ответ
 
Реально ли запилить нечто, имитирующее GOTO? (нужно для транслятора кода, т.е. убогость реализации не важна)
Через ассемблерные вставки, например (на месте goto вызывать jmp, а как узнать адрес куда нужно идти - не представляю)
Компилятор - tcc.

impersonalis 06.07.2012 22:39

Ответ: Вопрос-Ответ
 
goto есть в Си. Но если для парсера, то работа с указателями решает: указатели на переменные (в т.ч. массивы) и функции - что ещё надо?
Или поподробней.

Nerd 06.07.2012 22:46

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

goto есть в Си.
Упс, не знал. :@

Crayzi 17.10.2012 02:04

Ответ: Вопрос-Ответ
 
Есть ли справка для С++ подобная той, какая в Blitz3D? Ну всмысле с разбивкой функций по разделам, описанием ф-ций, а так-же примерами.

jimon 17.10.2012 02:18

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

Сообщение от Crayzi (Сообщение 240467)
Есть ли справка для С++ подобная той, какая в Blitz3D? Ну всмысле с разбивкой функций по разделам, описанием ф-ций, а так-же примерами.

http://www.cplusplus.com/

ANIK123 19.10.2012 23:01

Ответ: Вопрос-Ответ
 
привет.
есть обявление класса эфффекта
после есть обьявление класса юнита
проблема в том, что эффект должен хранить у себя сылку на экземпляр юнита и юнит должен хранить ссылку на эффект
как-то так
как они могут узнать друг-друга? и каким образом?

den 19.10.2012 23:05

Ответ: Вопрос-Ответ
 
Effect *fx;
Unit *un;
...
fx = new Effect(...);
un = new Unit(...);
fx->setUnit(un);
un->setEffect(fx);
...
delete fx;
delete un;

ANIK123 19.10.2012 23:17

Ответ: Вопрос-Ответ
 
зашибись, это то что надо, но как это сделать?
ведь когда эффект обьявляется перед юнитом то он не может хранить данные о юните, ибо о существовании такого типа эффекту пока ничего не известно
делаю так:
#include <effect_int.h> //интерфейс класса
#include <unit_int.h>
#include <effect.h> //определение класса
#include <unit.h>
как еще можно сделать?

den 19.10.2012 23:29

Ответ: Вопрос-Ответ
 
объявления классов сначала, потом их реализация:

Код:

Unit.hpp

#include "Effect.hpp"

class Unit
{
public:
    void f(int x);
protected:
private:
    Effect *fx;
};

-----------------------------------

Unit.cpp

#include "Unit.hpp"

void Unit::f(int x)
{
  ...
}

-----------------------------------
где-то в main.cpp

#include "Unit.hpp"
#include "Effect.hpp"
...
Effect *fx;
Unit *un;
...
fx = new Effect(...);
un = new Unit(...);
fx->setUnit(un);
un->setEffect(fx);
...
delete fx;
delete un;


ANIK123 20.10.2012 00:06

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

den 20.10.2012 00:41

Ответ: Вопрос-Ответ
 
Вложений: 1
ох я тебе не всё написал)
см вложения, там полная версия)

ANIK123 20.10.2012 00:54

Ответ: Вопрос-Ответ
 
О БОЖЕ! Работает! Впервые вижу запись типа: "class Effect;", но ОНО работает! С_П_А_С_И_Б_О!
ПС: Бл%№ь, теперь требуется полная переработка проекта -_-

ANIK123 20.10.2012 19:41

Ответ: Вопрос-Ответ
 
Блин, оказалось что у меня куча глобальных переменных, которые блин, используются в многих местах
как теперь быть?
например char buffer[2048]; стыреный из сэмплов ксорса - в каждом хедере его добавлять? ну а другие переменные, которые должны быть уникальными - что с ними делать?

HolyDel 20.10.2012 19:43

Ответ: Вопрос-Ответ
 
1) переписать все к чертям
2) сделать файл globals.h в котором будут
extern int g_my_global_int
globlas.cpp в котором будут
int g_my_global_int = 0;
во всех cpp-шках включать globals.h

den 20.10.2012 19:58

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

ANIK123 20.10.2012 20:08

Ответ: Вопрос-Ответ
 
ух ты) спасибо)
еще вопрос: а с "typedef unsigned short int usi;", который почти в каждом файле нужен, что делать?

Цитата:

Сообщение от Den (Сообщение 240774)
глобальные переменные зло, переработай архитектуру пока не поздно

ну камера у меня глобальная переменная, дефолтная текстура, обьект фастимейджа, и еще парочка

den 20.10.2012 20:13

Ответ: Вопрос-Ответ
 
сделать файл типа type.h, написать туда эту строчку и другие подобные и подключать его где надо.

ANIK123 21.10.2012 04:29

Ответ: Вопрос-Ответ
 
есть две переменные в юнит.hpp:
extern cUnit * PLAYER1, PLAYER2;
в юнит.срр пишу:
cUnit * PLAYER1 = 0;
cUnit * PLAYER2 = 0;

итог:e:\datar\inc\unit.cpp(249) : error C2040: PLAYER2: "cUnit *" отличается по уровням косвенного обращения от "cUnit"
еще не все...
в конструкторе: if (!(_stricmp(unit_name, "player1"))){is_player = true; PLAYER1 = this;}
итог: error C2679: бинарный '=': не найден оператор, принимающий правый операнд типа 'cUnit *const ' (или приемлемое преобразование отсутствует)
что за печаль такая(((

den 21.10.2012 11:04

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

есть две переменные в юнит.hpp:
extern cUnit * PLAYER1, PLAYER2;
в юнит.hpp только объявление класса Юнит
Цитата:

в юнит.срр пишу:
cUnit * PLAYER1 = 0;
cUnit * PLAYER2 = 0;
аналогично в юнит.срр только реализация конструктора, деструктора и методов класса Юнит

нахер ты там эти переменные создал?

ANIK123 21.10.2012 13:33

Ответ: Вопрос-Ответ
 
обьявил и определил игроков в самом конце файлов и работает)
может
проект еще в незапускаемом состоянии)

и еще: почему нельзя создавать там переменные?

den 21.10.2012 13:39

Ответ: Вопрос-Ответ
 
можно, но там им не место

ANIK123 21.10.2012 15:17

Ответ: Вопрос-Ответ
 
ура! запускается! но до конца еще есть куда пилять
вот заинклюдил как обычно очередной хедер/срр-шник, и вот: компилер упорно не хочет распознавать стд::вектор как тип, даже если пишу class std::vector; using namespace std;
подкинь какую-нить статью/книжечку где в кратце рассказывается о такой структуре проектов, или напиши что и как, а то еще всю программу закостыляю нафиг, если еще не закостылял
блин
(

если точнее:
хедер:
Код:

#ifndef _LOCALE_HPP
#define _LOCALE_HPP

#include <com.hpp>//глобальные переменные и т п

namespace LOCALE{
        extern char * Get(char part_name[32], char id[64]);
        extern void ChangeLanguage(char lang[]);

        extern void ChangeCurPart(char part_name[32]);
        extern char cur_part_name[32];

        class loc_part{
        public:
                ~loc_part();
                char name[32];
                class cText{
                public:
                        char id[64];
                        char data[1024];
                };
                vector<cText *> text;
        };
        extern vector<loc_part *> part;
};

#endif

срр:
Код:

#include <pch.h>

#include <locale.hpp>

vector<LOCALE::loc_part *> LOCALE::part; //<--------------ругается на это(((
............

pch.h
Код:

#ifndef PCH_H
#define PCH_H

.............
#include <vector>
.........

#endif

com.hpp:
Код:

#ifndef _COM_HPP
#define _COM_HPP

.............

using namespace std;
.............

#endif

еще говорит что error C2653: LOCALE: не является именем класса или пространства имен О_О Какого фига?!?

UPD:: да фиг с этим всем, если надо то могу дать ВЕСЬ исходный код

HolyDel 21.10.2012 16:04

Ответ: Вопрос-Ответ
 
судя по коду уже стопудово закостылял.

по текущему коду:
зачем функции extern?
она итак всегда extern если не inline.

почему название неймспейса написано капсом - капосм пишем дефайны или инлайн функции.

где включение pch.h? (оно очевидно должно быть в com.h, но я его там не вижу)
ну и явное задание размера массивов в параметрах и членах класса.
ты знаешь, что ты не сможешь вызвать функцию передавая ей массив другого (даже меньшего) размера?

почитай струструпа. главы 9,23,24.

ANIK123 23.10.2012 20:01

Ответ: Вопрос-Ответ
 
спасибо, почитал )
на счет проблемы: сделал вместо #include <locale.hpp> #include "locale.hpp" и все пошло как надо О_О
но есть еще в Локали функция: char * _(char id[64], char * text);
так вот, главный срр не хочет распознавать ни неймспейса Локали, ни функции
когда я повторно обьявляю эту функцию в главном срр, компилер просит 'libboost_locale-vc90-mt-gd-1_50.lib'
блин
и что делать? (буст использует луабинд)

UPD: Убрал нафиг вообще эту функцию, всеравно либу буста просит

UPD: Оййой) Поменял название хедера локали и все заработало) Надо бы убрать папку буста из списка каталогов студии))) Вопрос удачно закрыт)


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

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