Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.08;
Скачать: CL | DM;

Вниз

Как в С++ правильно работать с функциями?!   Найти похожие ветки 

 
Konstantin555 ©   (2006-09-06 00:05) [0]

Пишу так:


#include <iostream>
#include <string>
using namespace std;

int main()
{
extern void swap(int*,int*);

void swap(int* p, int* q)
{
 int t=*p;
 *p=*q;
 *q=t;
}

cout<<swap(1,4);

string name;

cout<<"Please enter you name:\n";
getline(cin,name);
cout<<"Hello, "<<name<<"!\n";
return 0;
}


В результате ошибки:
error C2601: "swap" : local function definitions are illegal
error C2664: "swap" : cannot convert parameter 1 from "const int" to "int *"
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

КАК ИСПРАВИТЬ?!


 
DiamondShark ©   (2006-09-06 00:11) [1]


> КАК ИСПРАВИТЬ?!

Перенести за пределы main
Ну нету в Ц вложенных ф-ций. Нету.
(плохой язык)


 
Cyrax ©   (2006-09-06 00:24) [2]

А extern можешь убрать - он подразумевается по умолчанию...
Да и вообще, объявление можно убрать - в одном модуле обычно его не пихают с implement"ом...

DiamondShark ©   (06.09.06 00:11) [1]
(плохой язык)

Ты о русском или C++ ?


 
guav ©   (2006-09-06 00:25) [3]

> cout<<swap(1,4);

Это что ?
Литеральные константы не указатели (кроме 0).
И вообще не lvalue чтобы получать на их ссылку и менять их местами.
и swap возвращает void, что должно пойти на cout ?


> [1] DiamondShark ©   (06.09.06 00:11)


> (плохой язык)

ага...


 
Cyrax ©   (2006-09-06 00:29) [4]

Да и вообще, объявление можно убрать - в одном модуле обычно его не пихают с implement"ом...

...если етот implement красуется до main"a...


 
Аноним2000   (2006-09-06 00:59) [5]

2Konstantin555
вот ентот фрагмент

> extern void swap(int*,int*);
>
> void swap(int* p, int* q)
> {
>  int t=*p;
>  *p=*q;
>  *q=t;
> }
>
> cout<<swap(1,4);

бред редкостный. просто удали его и все заработает


 
Cyrax ©   (2006-09-06 01:19) [6]

guav ©   (06.09.06 00:25) [3]
> cout<<swap(1,4);
Это что ?
Литеральные константы не указатели (кроме 0).

1. Не литерные константы, а целые константы...
2. 0 это никакой не указатель - см. п.1

И вообще не lvalue чтобы получать на их ссылку и менять их местами.

Не ссылку, а указатель (см. функцию)...

и swap возвращает void, что должно пойти на cout ?

Ничего. Выйдет ошибка...

>> (плохой язык)
> ага...
Всё-таки о русском...


 
Джо ©   (2006-09-06 01:19) [7]

> [6] Cyrax ©   (06.09.06 01:19)
> >> (плохой язык)
> > ага...
> Всё-таки о русском...

О говяжьем.


 
guav ©   (2006-09-06 01:31) [8]


> [6] Cyrax ©   (06.09.06 01:19)


> 1. Не литерные константы, а целые константы...

Литералы это и есть константы
Invariant program elements are called "literals" or "constants." The terms "literal" and "constant" are used interchangeably here. Literals fall into four major categories: integer, character, floating-point, and string literals.
http://msdn2.microsoft.com/en-us/library/c70dax92.aspx


> 2. 0 это никакой не указатель - см. п.1

0 это типа nil, пустой указатель. функция с таким объявлением может принять в качестве параметров (0, 0) (хотя данная функция и приведёт к AV при выполнении)


> Не ссылку, а указатель (см. функцию)...

ну да, ошибся... привык что это синонимы.


> Ничего. Выйдет ошибка...

так и я о том же.


> >> (плохой язык)
> > ага...
> Всё-таки о русском...

кто о чём, но я о С++, в часности о http://delphimaster.net/view/15-1157465777/


 
vidiv ©   (2006-09-06 02:21) [9]

Объясните, пожалуйста, смысл этой строки???

> cout<<"Please enter you name:\n";

А точнее символов <<


 
Cyrax ©   (2006-09-06 09:12) [10]

Всё, дальше идём в духе :)

guav ©   (06.09.06 01:31) [8]
>> 1. Не литерные константы, а целые константы...
>Литералы это и есть константы

Тогда получается тавтология:
литерная константа = литерный литерал (или константная константа)...

> Литералы это и есть константы
Invariant program elements are called "literals" or "constants." The terms "literal" and "constant" are used interchangeably here. Literals fall into four major categories: integer, character, floating-point, and string literals.

Настораживает "The terms "literal" and "constant" are used interchangeably here"
В более строгом понимании константа может быть представлена, например, символьным или числовым литералом. В примере в конечном счёте используется анонимная константа...

0 это типа nil, пустой указатель

1. nil - это в pascal"е, а в C - null.
2. 0 имеет тип int. Но с помощью стандартных преобразований приводится к типу указателя.

кто о чём, но я о С++...
Сожалею... :)


...в часности о http://delphimaster.net/view/15-1157465777/

А что там такого, если не секрет ?

> vidiv ©   (06.09.06 02:21) [9]
> Объясните, пожалуйста, смысл этой строки???
>> cout<<"Please enter you name:\n";
>А точнее символов <<

Это оператор вывода в поток.


 
Cyrax ©   (2006-09-06 11:55) [11]

Хочу сделать вот такое замечание.
В паскале то, что называют указателем, является на самом деле (по реализации) не чем иным, как сцылкой...


 
DiamondShark ©   (2006-09-06 12:06) [12]


> >А точнее символов <<
>
> Это оператор вывода в поток.

Какой это оператор -- зависит от того, какой инклуд подцеплен к исходному файлу.


 
DiamondShark ©   (2006-09-06 12:08) [13]


> В паскале то, что называют указателем, является на самом
> деле (по реализации) не чем иным, как сцылкой...

Всё с точностью до наоборот. УМЧ.


 
evvcom ©   (2006-09-06 12:13) [14]

> [11] Cyrax ©   (06.09.06 11:55)
> В паскале то, что называют указателем, является на самом
> деле (по реализации) не чем иным, как сцылкой...

А в чем разница? И пишется вообще-то так: "ссылка".


 
DiamondShark ©   (2006-09-06 12:18) [15]


> А в чем разница?

Ссылка -- абстрактное понятие.
Указатель -- машинно-зависимое.


 
Cyrax ©   (2006-09-06 12:46) [16]

DiamondShark ©   (06.09.06 12:06) [12]
Какой это оператор -- зависит от того, какой инклуд подцеплен к исходному файлу.

Да, но в контексте программы это всё-таки оператор потокового вывода...
Вспомним вопрос vidiv: "Объясните смысл строки..., а точнее символов <<"...

Всё с точностью до наоборот. УМЧ.

Если это указатель, то хотелось бы увидеть фрагмент кода на паскале, где этот указатель меняет своё значение путём, скажем, инкременирования...

Ссылка -- абстрактное понятие.
Указатель -- машинно-зависимое.

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


 
guav ©   (2006-09-06 12:52) [17]

> хотелось бы увидеть фрагмент кода на паскале, где этот указатель
> меняет своё значение путём, скажем, инкременирования...

пжалста
var
 I: Integer;
 P: ^Integer;
begin
 P := @I;
 ShowMessageFmt("P points at %P", [P]);

 Inc(P);
 ShowMessageFmt("P points at %P", [P]);
end;



> ...в часности о http://delphimaster.net/view/15-1157465777/
>
> А что там такого, если не секрет ?

Мой вопрос про сишную обработку исключений.


 
default ©   (2006-09-06 12:59) [18]

штука в том, что указатель это путь к анархии в доступе к памяти:)
его значение можно менять получая доступ к памяти, возможно, непринадлежащей объекту на который исходной указывал указатель
ссылка такого не допускает, ссылка это нечто дающее возможность работать с самим объектом, а не его копией(вольное и не полное определение)
поэтому в managed коде указателей нет, есть ссылки их в большинстве случае заменяющие


 
Alkid ©   (2006-09-06 13:33) [19]


> штука в том, что указатель это путь к анархии в доступе
> к памяти:)
> его значение можно менять получая доступ к памяти, возможно,
>  непринадлежащей объекту на который исходной указывал указатель
> ссылка такого не допускает, ссылка это нечто дающее возможность
> работать с самим объектом, а не его копией(вольное и не
> полное определение)
> поэтому в managed коде указателей нет, есть ссылки их в
> большинстве случае заменяющие

Не совсем верно, в .NET-managed code они могут быть в unsafe-коде (C# позволяет такой делать). В его рамках и указатели есть и их арифметика и возможность нетипобезопасных приведений указателей друг к другу. В Java их и правда нет. Собственно спор "ссылки vs. указатели" - это спор обобщённости и эффективности. В каждой задаче есть своя специфика и есть свои средства решения. Где-то и на асме надо писать, где у тебя нет никаких обобщений, сплошная "машинная специфика".


 
default ©   (2006-09-06 13:37) [20]

Alkid ©   (06.09.06 13:33) [19]
unsafe код это неуправляемый, CLR закрывает на него глаза
если таковой встретится в среде недоверяющей небезопасному коду, то такой код вообще исполнен не будет


 
default ©   (2006-09-06 13:46) [21]

+[20]
пардон, я по запарке попутал управляемость с безопасностью
в безопасном коде нет указателей, а не в управляемом


 
default ©   (2006-09-06 13:47) [22]

"CLR закрывает на него глаза"
в смысле, что этот код не проходит верификацию


 
default ©   (2006-09-06 13:51) [23]

Alkid ©   (06.09.06 13:33) [19]
кстати в C# гадство есть, нельзя получать доступ к полям упакованного размерного типа, приведение к размерному типу создаёт копию
в MC++ это можно...
есть один выход - интерфейсы, но это не очень удобное
я было в один подумал, что такое возможно в unsafe коде, но хрен...:(


 
Alkid ©   (2006-09-06 14:03) [24]

Упакованного - это про boxing/unboxing?


 
default ©   (2006-09-06 14:50) [25]

Alkid ©   (06.09.06 14:03) [24]
ага


 
Alkid ©   (2006-09-06 14:52) [26]

А ты вообще по каким критериям решаешь, чему у тебя быть размерным типом, а чему - ссылочным?


 
default ©   (2006-09-06 15:02) [27]

Alkid ©   (06.09.06 14:52) [26]
а причём здесь это?
а критерии в мсдн-е есть когда стоит применять структуры вместо классов если ты об этом


 
Cyrax ©   (2006-09-06 19:49) [28]

Тьфу, блин. Запутался я с этими ссылками и указателями.
Но... если подумать... Есть в паскале и ссылки, и указатели (и это разные вещи !!!). Ссылки используются только для передачи параметров в функцию/процедуру (передача по ссылке). Т.е. ссылки в программе нельзя объявлять и использовать в отличие от указателей. А вот указатели в паскале - обычное дело.

guav ©   (06.09.06 12:52) [17]
var
I: Integer;
P: ^Integer;
begin
P := @I;
ShowMessageFmt("P points at %P", [P]);
Inc(P);
ShowMessageFmt("P points at %P", [P]);
end;

Это что - фокус?  Хорошо... твоя взяла... :)

Мой вопрос про сишную обработку исключений.

Тебе нужна помощь или ты хочешь показать на примере исключений преимущества С... ?


default ©   (06.09.06 13:51) [23]
кстати в C# гадство есть, нельзя получать доступ к полям упакованного размерного типа...

Размерный - я так понимаю значимый (value). Т.е. хочешь сказать, что, допустим, если целое упакованное взять как объект, то не сможешь получить его значение (не распаковывая)... Правильно я тебя понял ?

приведение к размерному типу создаёт копию

Объект что - остаётся в куче ?

___________________________
А вообще, в C# много всяких ограничений и наворотов по сравнению с C++. Многие навороты в конце концов загромождают код и даже пересекаются друг с другом (частично дублируют свои функции), что не есть хорошо...
А вот по поводу ограничений, в частности отсутствие указателей (в безопасном коде) и шаблонов, - то это сильно урезает гибкость (часто и эффективность) средств разработки, доступных программисту.


 
guav ©   (2006-09-06 20:28) [29]

> Тебе нужна помощь

Мне уже вроде ответили, но если есть что добавить, давай.


> ты хочешь показать на примере исключений преимущества С...
> ?

Думаю речь о преимуществах С++, а не о преимуществах С, т.к. в С нет ни деструкторов ни исключений (стандартных).
Так вот, про преимущества обработки исключений в С++ .
Хотелось бы мне увидеть там преимущества.
Неужели действительно лучше паковать каждый динамический ресурс в класс (вынося код который был бы иначе в finally в деструкторы этих классов) и следить чтобы у этого класса конструктор не вывал исключения (т.е. не выполять в конструкторе ничего кроме выделения ресурса), чем просто использовать finally (и писать код функции в порядке выполнения) и использовать надёжно-вызываемые деструкторы, не задумываяь о возможных исключениях в конструкторах.


 
default ©   (2006-09-06 20:35) [30]

Cyrax ©   (06.09.06 19:49) [28]

> Размерный - я так понимаю значимый (value). Т.е. хочешь
> сказать, что, допустим, если целое упакованное взять как
> объект, то не сможешь получить его значение (не распаковывая).
> .. Правильно я тебя понял ?
 
ну распаковка по-любому нужна
распаковка собственно нужна, то есть без создания копии
есть соответствующая команда IL для этого

StructType st;
st.intfield = 7;
object o = st;
((StructType) o).intfield = 22;
Console.WriteLine(((StructType) o).intfield); // выведется 7, а не 22

в MC++ такую проблему можно избежать
но подобные манипуляции редко, думаю, используются так что можно сильно не переживать по этому поводу:)

не распаковывая, естественно, я не получу допуступ ко всей функциональности размерного типа(ну, к примеру, какой-нибудь перекрытый ToString() можно заюзать ибо он в Object сидит :))
обидно то, что при распаковке создаётся неупакованная размерная копия упакованного размерного типа, то есть первой не сказывается на изменении последней...
то есть изменение этой распаковки не влияет на изменение в object-е..
например,


 
default ©   (2006-09-06 20:37) [31]

последний абзац не читать:) забыл выкинуть


 
Cyrax ©   (2006-09-06 20:47) [32]

guav ©   (06.09.06 20:28) [29]
Думаю речь о преимуществах С++, а не о преимуществах С

Я имел ввиду семейство языков C, ну за искл., чистого С...

Так вот, про преимущества обработки исключений в С++...

В общем, сначала гляну http://msdn2.microsoft.com/en-us/library/c70dax92.aspx... Но не щас... Запарился я на форуме - не спишь, не ешь. Так и зачахнуть можно...

P.S. Всё будет !!! ...


 
evvcom ©   (2006-09-07 10:09) [33]

> [15] DiamondShark ©   (06.09.06 12:18)
> Ссылка -- абстрактное понятие.
> Указатель -- машинно-зависимое.

Любая реализация языка программирования написана для реальной машины/платформы, пусть даже виртуальной. Т.е. получается, что пока речь идет о теории и каких-то абстрактных языках, то оперируем термином "ссылка", как только начинаем говорить о реальном языке, то говорим "указатель"?

> [28] Cyrax ©   (06.09.06 19:49)
> Есть в паскале и ссылки, и указатели (и это разные вещи
> !!!). Ссылки используются только для передачи параметров
> в функцию/процедуру (передача по ссылке). Т.е. ссылки в
> программе нельзя объявлять и использовать в отличие от указателей.
> А вот указатели в паскале - обычное дело.

"Передача по ссылке" - это общепринятое выражение. А еще говорят, что если параметр передан по ссылке, то в переменной мы имеем указатель на данные. Так в чем же разница? Словоблудие и только. Мое имхо, это синонимы.


 
Alkid ©   (2006-09-07 10:44) [34]


> А вообще, в C# много всяких ограничений и наворотов по сравнению
> с C++. Многие навороты в конце концов загромождают код и
> даже пересекаются друг с другом (частично дублируют свои
> функции), что не есть хорошо...
  Хм. А какие навороты там друг с другом пересекаются?

> А вот по поводу ограничений, в частности отсутствие указателей
> (в безопасном коде) и шаблонов, - то это сильно урезает
> гибкость (часто и эффективность) средств разработки, доступных
> программисту.

Зато уменьшает количество возможностей отстрелить себе ногу. Огромные возможности - это всегда сила и слабость. Сила - потому что позволяет делать разные вещи быстро, красиво и эффективно. Слабость - потому что при неправльном приминении так же быстро и эффективно превращает программу в свалку мусора и глюков.  Взять С++ - множественное наследование. Вещь, безусловно, очень толковая, но при неумелом использовании можно себя загнать в угол. Указатели - быстро, эффективно, но черевато. И так далее.
Ссылки в этом смысле проще и безопаснее. Да, с их помощью ты не сможешь записать произвольный байт по произвольному адресу, но это обычно и не надо. Если пишешь просто ОО-приложеие без хакерства, то ссылок более чем достаточно.


 
Alkid ©   (2006-09-07 10:47) [35]


> Любая реализация языка программирования написана для реальной
> машины/платформы, пусть даже виртуальной. Т.е. получается,
>  что пока речь идет о теории и каких-то абстрактных языках,
>  то оперируем термином "ссылка", как только начинаем говорить
> о реальном языке, то говорим "указатель"?

Не совсем. А что если в какой-либо реализации .NET или Java ссылка - это
не указатель, а, например, индекс в таблице объектов? То есть реализация абстракции "ссылка" - это далеко не всегда обязательно указатель.


 
evvcom ©   (2006-09-07 10:50) [36]

> [35] Alkid ©   (07.09.06 10:47)

Вот с этим согласен.


 
Cyrax ©   (2006-09-07 11:21) [37]

> default ©   (06.09.06 20:35) [30]
StructType st;
st.intfield = 7;
object o = st;
((StructType) o).intfield = 22;
Console.WriteLine(((StructType) o).intfield); // выведется 7, а не 22


А o.intfield не получится ?  Ведь при упаковке создаётся объект и у етого объекта должно быть поле с числом 7...

Здесь в [object o = st] st упаковывается в кучу, а o начинает ссылаться на st (в куче) (пока имеем 7). (StructType) o распаковывает o в стек, меняем на 22 (7 уже не должно быть). Короче жуть получается.
Выходит, при упаковке/распаковке происходит не перемещение, а копирование. Это же УЖАС !!! Нарушается целостность данных !!!
Кто нибудь может вразумительно объяснить ?

И вообще, что в C# является значением ссылки (например, object o) - адрес объекта в куче ? Если так, то чем это не указатель ?

"При присваиваниях (замене аргументов) тип источника должен быть согласован с типом цели, то есть объект, связанный с источником, должен принадлежать классу, являющемуся потомком класса цели. В случае согласования типов, ссылочная переменная цели связывается с объектом источника и ее тип динамически изменяется, становясь типом источника."


не распаковывая, естественно, я не получу допуступ ко всей функциональности размерного типа

Имеется ввиду доступ к полю intfield в примере ?
(кстати, не читать - это значит неправильно ?)

Т.е. получается, что пока речь идет о теории и каких-то абстрактных языках, то оперируем термином "ссылка", как только начинаем говорить о реальном языке, то говорим "указатель"?

Я другого мнения. Возьмём, к примеру С++ - там и указатели, и ссылки...

Передача по ссылке" - это общепринятое выражение. А еще говорят, что если параметр передан по ссылке, то в переменной мы имеем указатель на данные. Так в чем же разница?

Например, в С++ предача по указателю и по ссылке - разные вещи. Да и в паскале есть и передача по указателю, и по ссылке...
Так что, ИМХО, разное всё это...

А еще говорят, что если параметр передан по ссылке, то в переменной мы имеем указатель на данные...

Чушь. Однозначно.
Значением ссылки являются данные, а указателя - адрес данных...


 
Alkid ©   (2006-09-07 11:26) [38]


> И вообще, что в C# является значением ссылки (например,
> object o) - адрес объекта в куче ? Если так, то чем это
> не указатель ?

А это принципиально неизвестно. Может быть указатель, может быть не указатель, программе на C# это должно быть фиолетово. И вообще, значение ссылки - это объект.

> Я другого мнения. Возьмём, к примеру С++ - там и указатели,
>  и ссылки...

Сдаётся мне, что reference в C++ и reference в Java/C# - это слишком разные вещи, что бы бросать их в одну кучу. Взять хотя бы то, что в C++ ссылки указывают всё время своей жизни на одно и то же, а в Java/C# могут менять объект, на котороый указывают и могут указывать на null.


 
evvcom ©   (2006-09-07 12:30) [39]

> [37] Cyrax ©   (07.09.06 11:21)
> Да и в паскале есть и передача по указателю, и по ссылке...
> Так что, ИМХО, разное всё это...

А... ну да... Поднялся на небеса (в смысле с низкого уровня программирования :) ) и стал понятен смысл того, о чем ты. :)

> Чушь. Однозначно.
> Значением ссылки являются данные, а указателя - адрес данных...

Да, да. Неверно выразился. Я в конструкции proc(var value) в паскале конечно же вижу данные по ссылке, но также четко представляю, что в процедуру (смотрим асм) передается на самом деле указатель. А уже интерпретация этого value (адрес или данные) лежит на совести шамана-компилятора. :)


 
default ©   (2006-09-07 13:16) [40]

Cyrax ©   (07.09.06 11:21) [37]
> А o.intfield не получится ?

да, не получится

> Ведь при упаковке создаётся объект и у етого объекта должно
> быть поле с числом 7...

да, но оно не доступно без распаковки(ты пойми, что в переменной типа object может храниться ссылка на экземпляр абсолютно любого типа, о каком o.intfield может идти речь?)


> Выходит, при упаковке/распаковке происходит не перемещение,
>  а копирование. Это же УЖАС !!! Нарушается целостность данных
> !!!
> Кто нибудь может вразумительно объяснить ?

ничего не нарушается, всё нормально, разве что код выдаёт несколько неестественный по виду кода результат

вот что я думаю
когда мы работаем с размерными типами изменение какого-либо экземпляра размерного типа не сказываются на чём-либо другом, это для нас понятно и естественно
не удивляемся же мы коду
int x = 5;
int y = x;
y = 7; // x = 5!
предположим такое
StructType st; // выделение в стеке памяти под переменную
st.intfield = 7;  // инициализация перед использованием переменной
object o = st;  // boxing
StructType v = (StructType) o; // предположим здесь не
//создаётся копия в стеке, а имеем доступ
// через переменную v  к запакованному размерному типу ссылка
// на который хранится в переменной o
v.intfield = 22; // вносим изменения, здесь нарушение единообразия
//происходит, изменение размерного экз-ра типа сказывается на  
//упакованном экз-ре размерном типе
Console.WriteLine(((StructType) o).intfield); // выведется 22

поэтому то, что в C# unboxing всегда действует в купе с копированием, для меня разумно, единообразие штука необычайно полезная


> И вообще, что в C# является значением ссылки (например,
> object o) - адрес объекта в куче ? Если так, то чем это
> не указатель ?

уже объяснил Alkid
> Имеется ввиду доступ к полю intfield в примере ?
> (кстати, не читать - это значит неправильно ?)

да
правильно, только я подумал лучше на примере показать о чем речь, а то забыл из поста убрать



Страницы: 1 2 3 вся ветка

Текущий архив: 2006.10.08;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.056 c
3-1154864407
ironwit
2006-08-06 15:40
2006.10.08
бакуп FB как embedded


15-1158332236
Deqww
2006-09-15 18:57
2006.10.08
Рекурсия - непонятная штука!


15-1158490716
X9
2006-09-17 14:58
2006.10.08
компиляция программ во FreePascal для MS-DOS


15-1158248312
AntiUser
2006-09-14 19:38
2006.10.08
Борцы с пиратами убили eDonkey, сеть завершила свою работу


9-1135469233
Аццкий_рыцарь:)
2005-12-25 03:07
2006.10.08
ГЛЮЧНОСТЬ В DELPHIX