
19.11.2008, 22:25
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
С нами:
9885926
Репутация:
1188
|
|
все билдится в Вижуал Студио 2008 с future pack - oм (хотя думаю фьюче пак не при чем)
|
|
|

20.11.2008, 02:05
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
С нами:
9885926
Репутация:
1188
|
|
значить вот такая история с подключением dll..
сначала когда массив задавался в самой библиотеке
(int mas[5]={0,1,2,3,4}  все работало без претензий при любом значении int Number, int am, int bm, int cm всегда получали правильное решение.
библиотека выглядела так:
Код:
#include "stdafx.h"
#include <conio.h>
int calc (int Number, int am, int bm, int cm)
{
int r=Number;
int a=am,b=bm,c=cm,n=5,resalt;
int mas[5]={0,1,2,3,4};
if(r==9){
_asm{
mov eax,0
mov ecx,n
lea esi,mas
l1:
add eax,[esi]
add esi,4
loop l1
add eax,c
mov resalt,eax
}}
else if(r<=5){
_asm{
mov eax,a
sub eax,c
mov a,eax
mov eax,b
mul b
add eax,a
mov ebx,c
cdq
div ebx
mov resalt,eax
}}
else resalt=666;
return resalt;
}
Другим цветом выделил часть кода которая работает с массивом.
потом массив я передал с другой функции, так как было описано ТУТ
для проверки корректности передачи элементов использовал вывод каждого
Код:
int calc ( int *mas, int Number, int am, int bm, int cm)
{
int r=Number;
int a=am,b=bm,c=cm,n=5,resalt;
char sdll[100] = {0};
sprintf(sdll,"%d", mas[1]);
MessageBoxA(NULL, sdll,"Result", NULL);
if(r==9){..........
тут все нормально. элементы массива корректно могут считываться и использоваться библиотекой.
но сам асм код который отвечает за обработку массива в результат кидал постоянно значения типа 3645435664 или 8764599943.....
вышел с положения только С++ кодом...
Код:
if(r==9){
int temp=0;
for(int i=0;i<n;i++)
{
temp=temp+mas[i];
}
resalt=cm +temp ;
}
так и не понял почему предыдущий РАБОТАЮЩИЙ асм код для массива который был обьявлен внутри dll не покатил для массива который передаем из другой функции...
а нужно именно асм код..
трабла в адресации памяти? или хз?
кто что посоветует?
спасибо.
-------------------EDIT---------------------------
решение проблемы - пост от bons.
bons, спасибо.
-------------------EDIT---------------------------
Последний раз редактировалось NetSter; 21.11.2008 в 19:38..
Причина: решение проблемы.
|
|
|

20.11.2008, 18:25
|
|
Познающий
Регистрация: 14.11.2007
Сообщений: 68
С нами:
9732478
Репутация:
8
|
|
Как мне сделать функцию с параметрами но при этом если параметры незадавать выполнялись параметры по умолчанию
|
|
|

20.11.2008, 19:28
|
|
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
С нами:
9746420
Репутация:
119
|
|
Сообщение от Diablo@Dragon
Как мне сделать функцию с параметрами но при этом если параметры незадавать выполнялись параметры по умолчанию
Можно внутри функции сделать проверку на наличие параметров.
|
|
|

21.11.2008, 15:48
|
|
Познающий
Регистрация: 07.09.2008
Сообщений: 79
С нами:
9302336
Репутация:
10
|
|
Сообщение от Diablo@Dragon
Как мне сделать функцию с параметрами но при этом если параметры незадавать выполнялись параметры по умолчанию
Код:
int main(void)
{
func(NULL);
return 0;
}
void func(int *n)
{
if(n == NULL)
{
puts("аргумент не задан !");
}
else
{
printf("аргумент = %d\n",*n);
}
}
Последний раз редактировалось xismyname; 21.11.2008 в 15:50..
|
|
|

21.11.2008, 17:05
|
|
Познающий
Регистрация: 14.11.2007
Сообщений: 68
С нами:
9732478
Репутация:
8
|
|
Сообщение от xismyname
Код:
int main(void)
{
func(NULL);
return 0;
}
void func(int *n)
{
if(n == NULL)
{
puts("аргумент не задан !");
}
else
{
printf("аргумент = %d\n",*n);
}
}
ну всёбы хорошо только вот это под микроконтроллер нада и нужно чтобы работало таким образом
Параметры по Умолчанию
Часто в самом общем случае функции требуется больше параметров, чем в самом простом и более употребительном случае. Например, в библиотеке потоков есть функция hex(), порождающая строку с шестнадцатиричным представлением целого. Второй параметр используется для задания числа символов для представления первого параметра. Если число символов слишком мало для представления целого, происходит усечение, если оно слишком велико, то строка дополняется пробелами. Часто программист не заботится о числе символов, необходимых для представления целого, поскольку символов достаточно. Поэтому для нуля в качестве второго параметра определено значение "использовать столько символов, сколько нужно". Чтобы избежать засорения программы вызовами вроде hex(i,0), функция описывается так:
extern char* hex(long, int =0);
Инициализатор второго параметра является параметром по умолчанию. То есть, если в вызове дан только один параметр, в качестве второго используется параметр по умолчанию.
Например:
cout << "**" << hex(31) << hex(32,3) << "**";
интерпретируется как
cout << "**" << hex(31,0) << hex(32,3) << "**";
и напечатает:
** 1f 20**
Параметр по умолчанию проходит проверку типа во время описания функции и вычисляется во время ее вызова. Задавать параметр по умолчанию возможно только для последних параметров, поэтому
int f(int, int =0, char* =0); // ok
int g(int =0, int =0, char*); // ошибка
int f(int =0, int, char* =0); // ошибка
Заметьте, что в этом контексте пробел между * и = является существенным (*= является операцией присваивания):
int nasty(char*=0); // синтаксическая ошибка
|
|
|

20.11.2008, 18:27
|
|
Участник форума
Регистрация: 26.02.2006
Сообщений: 209
С нами:
10633766
Репутация:
93
|
|
void func(int p=1;int p1=2)
{
}
Не уверен!
|
|
|

21.11.2008, 10:38
|
|
Познающий
Регистрация: 14.11.2007
Сообщений: 68
С нами:
9732478
Репутация:
8
|
|
Сообщение от ToniKapuchon
void func(int p=1;int p1=2)
{
}
Не уверен!
Сейчас проверим
|
|
|

20.11.2008, 18:34
|
|
Постоянный
Регистрация: 08.05.2006
Сообщений: 816
С нами:
10531106
Репутация:
1338
|
|
groupby Ну не знаю  )) Я конечно не настаиваю, но вроде такое заметил на Borland C++...
Последний раз редактировалось GlOFF; 20.11.2008 в 18:36..
|
|
|

20.11.2008, 19:28
|
|
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
С нами:
9679872
Репутация:
347
|
|
2 NetSter
Не используй инструкцию lea
вместо lea esi, mas
напиши mov esi, mas
- так будет правильно. Компилятор это превратит примерно в следующее:
mov esi, DWORD PTR [ebp+8]
то есть занесение в esi содержимого параметра mas и это есть правда.
P.S.
а когда ты вместо mov пишешь lea получается:
lea esi, DWORD PTR [ebp+8]
что есть занесение в esi адреса переменной mas, что тебе совсем не нужно
Последний раз редактировалось bons; 20.11.2008 в 20:02..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|