Помогите!!!
Помогите!!!
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
{
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
- Контактная информация:
Помогите!!!
// Этот пример работает правильно. Но позволь дать тебе несколько советов
// Во-первых, чтобы было меньше проблем всегда используй явное приведение типов.
// Во вторых, вот эти вещи никогда не создавай в стеке, если это возможно.
// 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;
}
// Во-первых, чтобы было меньше проблем всегда используй явное приведение типов.
// Во вторых, вот эти вещи никогда не создавай в стеке, если это возможно.
// 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;
}
Если вы все такие умные - что же вы строем не ходите?
Помогите!!!
В *pShort заносятся 2 байта по адресу (Code+12). Там хранится: 0xaa, 0x??. В байте по адресу (Code+13) может
быть какой угодно мусор. В твоем случае это был 0xff. В соответствии с big-endian архитектурой процессора, в твой
short попадает 0xffaa.
быть какой угодно мусор. В твоем случае это был 0xff. В соответствии с big-endian архитектурой процессора, в твой
short попадает 0xffaa.
Помогите!!!
>> Atetz
Это происходит даже если проинициализировать оба массива нулями.
:confused
>>Aerostar
Что ты предлагаеш использовать вместо приведения (unsigned short int*) к (unsigned short int)?
А вобще это кусок кода скриптового движка(в будущем) для rogue-like RPG
Это происходит даже если проинициализировать оба массива нулями.
:confused
>>Aerostar
Что ты предлагаеш использовать вместо приведения (unsigned short int*) к (unsigned short int)?
А вобще это кусок кода скриптового движка(в будущем) для rogue-like RPG
Помогите!!!
>> Aerostar
По моему ты недопонял: я пытаюсь поместить баит из массива Code в ячейку размером слово в массиве Data(я представляю 2 элемента массива размером байт как слово).
По моему ты недопонял: я пытаюсь поместить баит из массива Code в ячейку размером слово в массиве Data(я представляю 2 элемента массива размером байт как слово).
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.
- Нет. Это ласточка беременная мыслью.
Помогите!!!
2kirya85: Что-то не верится. Напиши, как ты инициализируешь.
И еще: ты собрался эту игрушку гонять только на big-endian 32-bit ? На других архитектурах этот код может себя повести довольно непредсказуемо.
И еще, парни, у меня наверное приступ слепоты, но я тут нигде не вижу приведения (unsigned short int*) к (unsigned short int).
И еще: ты собрался эту игрушку гонять только на big-endian 32-bit ? На других архитектурах этот код может себя повести довольно непредсказуемо.
И еще, парни, у меня наверное приступ слепоты, но я тут нигде не вижу приведения (unsigned short int*) к (unsigned short int).
- Aerostar
- Неотъемлемая часть форума
- Сообщения: 447
- Зарегистрирован: 08 фев 2002, 14:47
- Откуда: Riga
- Контактная информация:
Помогите!!!
А чтобы не инициализировать, повторюсь, то массивы надо не в стеке а дампе создавать, тогда они инициализируются нулями.
2Atetz
Ты знаешь, я тоже не понял откуда он это ((unsigned short int*) к (unsigned short int)) взял. Вот (short int*) к unsigned short он приводит, и я в своей версии кода эту ошибку исправил.
2kirya85
2Atetz
Ты знаешь, я тоже не понял откуда он это ((unsigned short int*) к (unsigned short int)) взял. Вот (short int*) к unsigned short он приводит, и я в своей версии кода эту ошибку исправил.
2kirya85
Я предлагаю таких вещей избегать и пользоваться нормальными указателями. Между прочим, мой компилятор (gcc2.96 из РХ73) твой пример без напильника даже отказался компилировать. Ты попробуй какое-то время писать на плюсах - очень дисциплинирует в плане работы с типами.Что ты предлагаеш использовать вместо приведения (unsigned short int*) к (unsigned short int)?
Если вы все такие умные - что же вы строем не ходите?
Помогите!!!
2Atetz:
for(int i=0;i<65536;i++)
{
Code=Data=0;
}
Вставляю сразу после объявления переменных.
for(int i=0;i<65536;i++)
{
Code=Data=0;
}
Вставляю сразу после объявления переменных.
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.
- Нет. Это ласточка беременная мыслью.
- Aerostar
- Неотъемлемая часть форума
- Сообщения: 447
- Зарегистрирован: 08 фев 2002, 14:47
- Откуда: Riga
- Контактная информация:
Помогите!!!
О-паньки. Да за что же ты их так?
65536 раз объясняешь пацанам, что они - нулевые указатели.
Если ты хотел поправить содержимое, то надо хотя бы так:
for(int i=0;i<65536;i++)
{
Code\[i\]=Data\[i\]=0;
}
(Отредактировал(а) Aerostar - 11:32 - 17 Авг., 2002)
65536 раз объясняешь пацанам, что они - нулевые указатели.
Если ты хотел поправить содержимое, то надо хотя бы так:
for(int i=0;i<65536;i++)
{
Code\[i\]=Data\[i\]=0;
}
(Отредактировал(а) Aerostar - 11:32 - 17 Авг., 2002)
Если вы все такие умные - что же вы строем не ходите?
Помогите!!!
Извеняюсь звёздаки забыл когда набирал в пост. В исходнике всё Ok.
Всё это дело компилится под djgpp.
Всё это дело компилится под djgpp.
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.
- Нет. Это ласточка беременная мыслью.
- Aerostar
- Неотъемлемая часть форума
- Сообщения: 447
- Зарегистрирован: 08 фев 2002, 14:47
- Откуда: Riga
- Контактная информация:
Помогите!!!
2kirya85
Так что, проблема решилась или нет?
Так что, проблема решилась или нет?
Если вы все такие умные - что же вы строем не ходите?
Помогите!!!
Да я сам нашёл другой подход. Инициализация здесь не причём.
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.
- Нет. Это ласточка беременная мыслью.
- Aerostar
- Неотъемлемая часть форума
- Сообщения: 447
- Зарегистрирован: 08 фев 2002, 14:47
- Откуда: Riga
- Контактная информация:
Помогите!!!
Расскажи, пожалуйста, поподробнее.
Если вы все такие умные - что же вы строем не ходите?
Помогите!!!
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;
}
{
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
- Контактная информация:
Помогите!!!
Тоже верно.
А все-таки, почему ты создаешь массивы в стеке (как локальные переменные)? Ведь, в этом случае, они инициализируются мусором, а, во-вторых, при некоторых обстоятельствах, у тебя просто может запортиться память (про переполнение стека слышал?), что приведет к непредсказуемым последствиям. Я бы тебе порекомендовал такие вещи создавать как глобальные или как статические - это безопасно и более корректно.
А все-таки, почему ты создаешь массивы в стеке (как локальные переменные)? Ведь, в этом случае, они инициализируются мусором, а, во-вторых, при некоторых обстоятельствах, у тебя просто может запортиться память (про переполнение стека слышал?), что приведет к непредсказуемым последствиям. Я бы тебе порекомендовал такие вещи создавать как глобальные или как статические - это безопасно и более корректно.
Если вы все такие умные - что же вы строем не ходите?