HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 19.11.2008, 22:25
NetSter
студент
Регистрация: 30.07.2007
Сообщений: 800
С нами:
9885926

Репутация: 1188


По умолчанию

все билдится в Вижуал Студио 2008 с future pack - oм (хотя думаю фьюче пак не при чем)
 
Ответить с цитированием

  #2  
Старый 20.11.2008, 02:05
NetSter
студент
Регистрация: 30.07.2007
Сообщений: 800
С нами:
9885926

Репутация: 1188


Lightbulb

значить вот такая история с подключением 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.. Причина: решение проблемы.
 
Ответить с цитированием

  #3  
Старый 20.11.2008, 18:25
Diablo@Dragon
Познающий
Регистрация: 14.11.2007
Сообщений: 68
С нами:
9732478

Репутация: 8
По умолчанию

Как мне сделать функцию с параметрами но при этом если параметры незадавать выполнялись параметры по умолчанию
 
Ответить с цитированием

  #4  
Старый 20.11.2008, 19:28
criz
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
С нами:
9746420

Репутация: 119
По умолчанию

Цитата:
Сообщение от Diablo@Dragon  
Как мне сделать функцию с параметрами но при этом если параметры незадавать выполнялись параметры по умолчанию
Можно внутри функции сделать проверку на наличие параметров.
 
Ответить с цитированием

  #5  
Старый 21.11.2008, 15:48
xismyname
Познающий
Регистрация: 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..
 
Ответить с цитированием

  #6  
Старый 21.11.2008, 17:05
Diablo@Dragon
Познающий
Регистрация: 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); // синтаксическая ошибка
 
Ответить с цитированием

  #7  
Старый 20.11.2008, 18:27
ToniKapuchon
Участник форума
Регистрация: 26.02.2006
Сообщений: 209
С нами:
10633766

Репутация: 93
По умолчанию

void func(int p=1;int p1=2)
{
}
Не уверен!
 
Ответить с цитированием

  #8  
Старый 21.11.2008, 10:38
Diablo@Dragon
Познающий
Регистрация: 14.11.2007
Сообщений: 68
С нами:
9732478

Репутация: 8
По умолчанию

Цитата:
Сообщение от ToniKapuchon  
void func(int p=1;int p1=2)
{
}
Не уверен!
Сейчас проверим
 
Ответить с цитированием

  #9  
Старый 20.11.2008, 18:34
GlOFF
Постоянный
Регистрация: 08.05.2006
Сообщений: 816
С нами:
10531106

Репутация: 1338


По умолчанию

groupby Ну не знаю )) Я конечно не настаиваю, но вроде такое заметил на Borland C++...

Последний раз редактировалось GlOFF; 20.11.2008 в 18:36..
 
Ответить с цитированием

  #10  
Старый 20.11.2008, 19:28
bons
Участник форума
Регистрация: 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..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Уязвимости CMS / форумов 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.