Помогите!!!

Все о программировании под *nix
Аватара пользователя
kas
Маньяк
Сообщения: 184
Зарегистрирован: 10 июл 2002, 03:15
Откуда: Минск

Помогите!!!

Сообщение kas »

int main()
{
unsigned short int arg1;
char temp;
short int IP=10;
char* Code[65536];
char* Data[65536];
short int pShort

*((char *)Code+IP) = 0x00;
*((char *)Code+IP+1) = 0x04;
*((char *)Code+IP+2) = 0xaa;
*((char *)Data+0x400) = 0;
*((char *)Data+0x401) = 0;

arg1 =*((unsigned short int*)((char*)Code+IP));

IP+=2;

pShort = (short int*)((char*)Data+arg1);
*pShort=*((char*)Code+IP);

IP++;

return 0;
}


Никак ни пойму почему в *pShort заносится 0xffaa вместо 0x00aa
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.

Аватара пользователя
Aerostar
Неотъемлемая часть форума
Сообщения: 447
Зарегистрирован: 08 фев 2002, 14:47
Откуда: Riga
Контактная информация:

Помогите!!!

Сообщение Aerostar »

// Этот пример работает правильно. Но позволь дать тебе несколько советов :)
// Во-первых, чтобы было меньше проблем всегда используй явное приведение типов.
// Во вторых, вот эти вещи никогда не создавай в стеке, если это возможно.
//  char* Code[65536];
//  char* Data[65536];
// В-третьих, не используй непереносимые конструкции, типа приведения (unsigned short int*) к (unsigned short int).
// А еще вопрос: а что это за программа, для который используется, мягко говоря,
// такой странный код? Наверное, преподы в РТИ озверели?
#include <stdio.h>
int main()
{
 unsigned short int arg1;
 char temp;
 short int IP=10;
 char* Code[65536];
 char* Data[65536];
 short int *pShort ;

 *((char *)Code+IP) = 0x00;
 *((char *)Code+IP+1) = 0x04;
 *((char *)Code+IP+2) = 0xaa;
 *((char *)Data+0x400) = 0;
 *((char *)Data+0x401) = 0;

 arg1 =*((unsigned short int*)((char*)Code+IP));

 IP+=2;

 pShort = (short int*)((char*)Data+arg1);
 *pShort =
   *(short int*)((char*)Code+IP);
 printf("%x\n",*pShort) ;
 IP++;

 return 0;
}
Если вы все такие умные - что же вы строем не ходите?

Lynxer
Неотъемлемая часть форума
Сообщения: 285
Зарегистрирован: 10 мар 2002, 14:44
Откуда: Minsk

Помогите!!!

Сообщение Lynxer »

В *pShort заносятся 2 байта по адресу (Code+12). Там хранится: 0xaa, 0x??. В байте по адресу (Code+13) может
быть какой угодно мусор. В твоем случае это был 0xff. В соответствии с big-endian архитектурой процессора, в твой
short попадает 0xffaa.

Аватара пользователя
kas
Маньяк
Сообщения: 184
Зарегистрирован: 10 июл 2002, 03:15
Откуда: Минск

Помогите!!!

Сообщение kas »

>> Atetz

Это происходит даже если проинициализировать оба массива нулями.
:confused

>>Aerostar

Что ты предлагаеш использовать вместо приведения (unsigned short int*) к (unsigned short int)?

А вобще это кусок кода скриптового движка(в будущем) для rogue-like RPG

Аватара пользователя
kas
Маньяк
Сообщения: 184
Зарегистрирован: 10 июл 2002, 03:15
Откуда: Минск

Помогите!!!

Сообщение kas »

>> Aerostar
По моему ты недопонял: я пытаюсь поместить баит из массива  Code в ячейку размером слово в массиве Data(я представляю 2 элемента массива размером байт как слово).
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.

Lynxer
Неотъемлемая часть форума
Сообщения: 285
Зарегистрирован: 10 мар 2002, 14:44
Откуда: Minsk

Помогите!!!

Сообщение Lynxer »

2kirya85: Что-то не верится. Напиши, как ты инициализируешь.
И еще: ты собрался эту игрушку гонять только на big-endian 32-bit ? На других архитектурах этот код может себя повести довольно непредсказуемо.
И еще, парни, у меня наверное приступ слепоты, но я тут нигде не вижу приведения (unsigned short int*) к (unsigned short int).

Аватара пользователя
Aerostar
Неотъемлемая часть форума
Сообщения: 447
Зарегистрирован: 08 фев 2002, 14:47
Откуда: Riga
Контактная информация:

Помогите!!!

Сообщение Aerostar »

А чтобы не инициализировать, повторюсь, то массивы надо не в стеке а дампе создавать, тогда они инициализируются нулями.
2Atetz
Ты знаешь, я тоже не понял откуда он это ((unsigned short int*) к (unsigned short int)) взял. Вот (short int*) к unsigned short он приводит, и я в своей версии кода эту ошибку исправил.
2kirya85
Что ты предлагаеш использовать вместо приведения (unsigned short int*) к (unsigned short int)?
Я предлагаю таких вещей избегать и пользоваться нормальными указателями. Между прочим, мой компилятор (gcc2.96 из РХ73) твой пример без напильника даже отказался компилировать. Ты попробуй какое-то время писать на плюсах - очень дисциплинирует в плане работы с типами.
Если вы все такие умные - что же вы строем не ходите?

Аватара пользователя
kas
Маньяк
Сообщения: 184
Зарегистрирован: 10 июл 2002, 03:15
Откуда: Минск

Помогите!!!

Сообщение kas »

2Atetz:

for(int i=0;i<65536;i++)
{
Code=Data=0;
}

Вставляю сразу после объявления переменных.
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.

Аватара пользователя
Aerostar
Неотъемлемая часть форума
Сообщения: 447
Зарегистрирован: 08 фев 2002, 14:47
Откуда: Riga
Контактная информация:

Помогите!!!

Сообщение Aerostar »

О-паньки. Да за что же ты их так?
65536 раз объясняешь пацанам, что они - нулевые указатели.
Если ты хотел поправить содержимое, то надо хотя бы так:
for(int i=0;i<65536;i++)
{
Code\[i\]=Data\[i\]=0;
}



(Отредактировал(а) Aerostar - 11:32 - 17 Авг., 2002)
Если вы все такие умные - что же вы строем не ходите?

Аватара пользователя
kas
Маньяк
Сообщения: 184
Зарегистрирован: 10 июл 2002, 03:15
Откуда: Минск

Помогите!!!

Сообщение kas »

Извеняюсь звёздаки забыл когда набирал в пост.  В исходнике всё Ok.

Всё это дело компилится под djgpp.
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.

Аватара пользователя
Aerostar
Неотъемлемая часть форума
Сообщения: 447
Зарегистрирован: 08 фев 2002, 14:47
Откуда: Riga
Контактная информация:

Помогите!!!

Сообщение Aerostar »

2kirya85
Так что, проблема решилась или нет?
Если вы все такие умные - что же вы строем не ходите?

Аватара пользователя
kas
Маньяк
Сообщения: 184
Зарегистрирован: 10 июл 2002, 03:15
Откуда: Минск

Помогите!!!

Сообщение kas »

Да я сам нашёл другой подход. Инициализация здесь не причём.
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.

Аватара пользователя
Aerostar
Неотъемлемая часть форума
Сообщения: 447
Зарегистрирован: 08 фев 2002, 14:47
Откуда: Riga
Контактная информация:

Помогите!!!

Сообщение Aerostar »

Расскажи, пожалуйста, поподробнее.
Если вы все такие умные - что же вы строем не ходите?

Аватара пользователя
kas
Маньяк
Сообщения: 184
Зарегистрирован: 10 июл 2002, 03:15
Откуда: Минск

Помогите!!!

Сообщение kas »

int main()
{
unsigned short int arg1;
char temp;
short int IP=10;
char* Code[65536];
char* Data[65536];

*((char *)Code+IP) = 0x00;
*((char *)Code+IP+1) = 0x04;
*((char *)Code+IP+2) = 0xaa;

arg1 =*((unsigned short int*)((char*)Code+IP));

IP+=2;

*((char*)Data+arg1)=*((char*)Code+IP);
*((char*)Data+arg1+1)=0;

IP++;

return 0;
}
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.

Аватара пользователя
Aerostar
Неотъемлемая часть форума
Сообщения: 447
Зарегистрирован: 08 фев 2002, 14:47
Откуда: Riga
Контактная информация:

Помогите!!!

Сообщение Aerostar »

Тоже верно.
А все-таки, почему ты создаешь массивы в стеке (как локальные переменные)?  Ведь, в этом случае, они инициализируются мусором, а, во-вторых, при некоторых обстоятельствах, у тебя просто может запортиться память (про переполнение стека слышал?), что приведет к непредсказуемым последствиям. Я бы тебе порекомендовал такие вещи создавать как глобальные или как статические - это безопасно и более корректно.
Если вы все такие умные - что же вы строем не ходите?

Ответить