PDA

Tam Sürümünü Görmek İçin : error C2065: undeclared identifier nedir, neden oluyor?


garalo
11/03/2008, 15:12
frmView.cpp isminde bir dosyam var


namespace imageArrayCplus {

public ref class frmView : public System::Windows::Forms::Form
{
...
void frmView::frmView_Load(System::Object ^sender, System::EventArgs ^e)
{
//imgDisplay->Image = System::Drawing::Image::FromFile(Form1::ImageToSho w); // burada hata geliyor
imgDisplay->Image = Image::FromFile(Form1::ImageToShow);
lblImageName->Text = Form1::ImageToShow;
// Center image
imgDisplay->Left = (this->Width - imgDisplay->Width)/2;
}
...
}

ayrica baska bir dosyam daha var buradan yukaridaki dosyayi cagirincada hata geliyor.

namespace imageArrayCplus {

public ref class Form1 : public System::Windows::Forms::Form
{
// The Event to click the image
void Form1::ClickImage(System::Object ^sender, System::EventArgs ^e)
{
// imageArrayCplus::frmView ^f;
// On Click: load (ImageToShow) with (Tag) of the image
ImageToShow = (safe_cast<System::Windows::Forms::PictureBox^>(sender))->Tag->ToString();
// then view this image on the form (frmView)
/*imageArrayCplus::frmView ^f = gcnew imageArrayCplus::frmView();*/
frmView ^f = gcnew frmView(); // burada ne yaptiysam surekli hata veriyor???? verdigi hatalar asagida..
f->ShowDialog();
}
};
}


1>------ Build started: Project: imageArrayCplus, Configuration: Debug Win32 ------
1>Compiling...
1>stdafx.cpp
1>c:\users\ahmet\documents\visual studio 2008\projects\imagearraycplus\imagearraycplus\Form 1.h(151) : error C2065: 'frmView' : undeclared identifier
1>c:\users\ahmet\documents\visual studio 2008\projects\imagearraycplus\imagearraycplus\Form 1.h(151) : error C2065: 'f' : undeclared identifier
1>c:\users\ahmet\documents\visual studio 2008\projects\imagearraycplus\imagearraycplus\Form 1.h(151) : error C2061: syntax error : identifier 'frmView'
1>c:\users\ahmet\documents\visual studio 2008\projects\imagearraycplus\imagearraycplus\Form 1.h(152) : error C2065: 'f' : undeclared identifier
1>c:\users\ahmet\documents\visual studio 2008\projects\imagearraycplus\imagearraycplus\Form 1.h(152) : error C2227: left of '->ShowDialog' must point to class/struct/union/generic type
1> type is ''unknown-type''
1>Build log was saved at "file://c:\Users\ahmet\Documents\Visual Studio 2008\Projects\imageArrayCplus\imageArrayCplus\Debu g\BuildLog.htm"
1>imageArrayCplus - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

C++ ya baslayali bir hafta oldu. C++ ile yapmam gereken bir proje var ve ben bunu bu hafta icerisinde bitirmem
gerekiyor lutfen yardim.


golgepapaz
11/03/2008, 16:04
herseyden once bu c++ degil; gcnew ve ^ isaretlerinden c++/cli oldugu sonucunu cikariyorum.

.net konusunda uzman degilim ama, sorun ClickImage metodunun icinde frmView tanimli olmamasindan kaynaklaniyor. Eger bu c++ olsaydi frmview in tanimlandigi dosyayi #include komutuyla gorunur yapman gerekiyordu. eger frmview.h diye bir dosyan varsa ikinci dosyanin icinde onu include etmen gerekiyor.

garalo
12/03/2008, 05:03
Evet dedigin dogru, C++/cli kullaniyorum ama daha yeni oldugum icin ne nedir o kadarda bilmiyoruma ama benim bir hafta icinde prpojeyi bitirmem gerekiyor. O yuzden actim visual studio yu ve basladim yazmaya.
Sanirim problemin ne oldugunu az cok kavradim gibi ama cozumunu halen bulmus degilim. zaten yukardaki yazdigim kodlar *.h dosyalari icinde. .cpp icerisinde sadece main method var hepsi o kadar. Yani fazla bilgim ve deneyiyim yok.
biraz daha problemimden bahsedeyim. #includeleri yaptim bu kezde yeni problem cikti.
Form1.h dosyam icerisinde

public:
static System::String ^ImageToShow;
boyle bir static tanimlama yaptim ve
su sekilde initalize yaptim

void ClickImage(System::Object ^sender, System::EventArgs ^e)
{
frmView ^f = gcnew frmView();
// bu sekilde initalize yapiyorum.
ImageToShow = (safe_cast<System::Windows::Forms::PictureBox^>(sender))->Tag->ToString();

f->ShowDialog();
}

ve burayi frmView.h dosyasi icerisinden cagiriyorum ama gelmiyor:iih:

void frmView_Load(System::Object ^sender, System::EventArgs ^e)
{

//imgDisplay->Image = Image::FromFile(Application::StartupPath + "\\Images");
imgDisplay->Image = Image::FromFile(Form1::ImageToShow);
lblImageName->Text = Form1::ImageToShow;
// Center image
imgDisplay->Left = (this->Width - imgDisplay->Width)/2;
}

neden burada hata veriyor acaba??? bu hatalar geliyor
error C2653: 'Form1' : is not a class or namespace name
error C2065: 'ImageToShow' : undeclared identifier
......

bu kodun C# versiyonu problem olmadan calisiyor. Ama C++ da "nuh" diyor "peygamber" demiyor. :aglama:

neyse java olsaydi setter getter ile isi coktan halletmistim ama C++ da nasil yapilir bilmiyorum.

Ha ayrica unutmadan, problemime bu kadar hizli yanit verilecegini dusunmemistim. Burasi javacilara nazaran daha aktif gibime geldi.
Yanit verdiginiz icin cok tesekkur ederim forumdasim:super:.

acehreli
12/03/2008, 09:43
Derleyicinin kullanilan her sozcugun ne oldugunu bilmesi gerekir. Eger Form1, kullandigin satirdan once tanitilmadiysa kullanilamaz.

#include, baska bir dosyayi butunuyle bir satira almak anlamina gelir. Boylece bir baslik dosyasinda tanitilan butun adlari bir dosya icinde kullanabiliriz.

Form1'i kullandigin yerden once, Form1'i tanitan baslik dosyasini #include etmen gerekiyor.

Ali

garalo
12/03/2008, 12:40
tesekkurler ama halen problem devam ediyor. bu kezde too many include hatasi geliyor. Form1.h icerisine frmView.h `i include edince
frmView ^f = gcnew frmView();
Buradaki hata gelmiyor.
Tam tersi yani frmView.h icerisine Form1.h`i include edince bu kezde
imgDisplay->Image = Image::FromFile(Form1::ImageToShow);
lblImageName->Text = Form1::ImageToShow;
bolumundeki hata duzeliyor.
Eger iki dosyaya birden include yapinca
Form1.h
#include "frmView.h"
.....

frmView.h icerisine ise
#include "Form1.h"
.....

yapinca yukarida dedigim gibi too many include ( cok fazla include var diye ) hata geliyor.

nedendir anlamis degilim. ????:s006:

isterseniz dosyayada bir goz atabilirsiniz. Dosya biraz buyuk oldugu icin (malum microsoft ekliyorda ekliyor birseyler.:utangac:) baska bir servere upload ettim. Buradan projeyi oldugu gibi indirip deneyebilirsiniz. (http://www.4shared.com/dir/6064654/17831a0/sharing.html)

golgepapaz
12/03/2008, 13:35
Eger iki dosyaya birden include yapinca
Form1.h
#include "frmView.h"
.....

frmView.h icerisine ise
#include "Form1.h"
.....

yapinca yukarida dedigim gibi too many include ( cok fazla include var diye ) hata geliyor.

nedendir anlamis degilim. ????


ok bu durumun olusmasi normal , cunku bir headeri include ettiginde, (mesela Form1.h)
onun icinde Frmview1.h include ediliyor, FrmViev,h de kendi icinde Form1.h yi tekrar include ediyor.] oda tekrar Frmview.h yi include ediyor. bu yuzden bir loop olusuyor.
bunu cozmenin bir kac yolu var.
...
En dogru olani senin bu metod implementasyonularini headerdan cikarip bir .cpp dosyasina kopyalaman.

mesela Form1.cpp ve FrmView.cpp diye
sonra bu dosyalarin icinden iki hedari da ayri ayri include edip , sonsuz donguden kacinman....

Form1.cpp
------------------------
#include "FrmView.h"
#include "Form1.h"


Frmview.cpp
-----------------------
#include "Form1.h"
#include "FrmView.h"

gibi.

ama diyosanki ben tembel bi adamim(iyi birseydir) ,boyle dosyalari bolmekle ugrasip dependencyleri azaltma ugrasamam bu durumda da header dosyalarinin icinde en basa
"#pragma once" yaz kurtul. eger yine olmazsa dosyalara include guard koyman gerekiyor. (aslinda pragma once la ayni sey)

acehreli
12/03/2008, 15:45
Kucuk bir ayrinti: #pragma once'in "include guard"dan bir farki, dosyayi ikinci kere acmamasidir. "include guard" yonteminde ise dosya her seferinde acilir, ama icerigi kullanilmamis olur.

Bu fazladan acmalarin eski sistemlerde derlemeyi cok yavaslattigi soyleniyordu. Onun icin zamaninda "external include guards" da onerilip kullanilmisti.

Ali

golgepapaz
12/03/2008, 16:42
ayrica include guard'da en sondaki #endif'in bulunabilmesi icin dosyanin yinede parse edilmesi gerekiyor tabiiki bu da zaman aliyor. Soyledigin ikinci metoduda ben Lakos'tan guard rings diye ogrenmistim , su anda da kullaniyorum zaten cunku derlemem gereken template kullanan 3000 dosyam var :).

garalo
13/03/2008, 07:19
Kucuk bir ayrinti: #pragma once'in "include guard"dan bir farki, dosyayi ikinci kere acmamasidir. "include guard" yonteminde ise dosya her seferinde acilir, ama icerigi kullanilmamis olur.

Bu fazladan acmalarin eski sistemlerde derlemeyi cok yavaslattigi soyleniyordu. Onun icin zamaninda "external include guards" da onerilip kullanilmisti.

Ali

ayrica include guard'da en sondaki #endif'in bulunabilmesi icin dosyanin yinede parse edilmesi gerekiyor tabiiki bu da zaman aliyor. Soyledigin ikinci metoduda ben Lakos'tan guard rings diye ogrenmistim , su anda da kullaniyorum zaten cunku derlemem gereken template kullanan 3000 dosyam var :).

arkadaslar cok sagolun. Dediklerinizi yaptim ama halen diger bir class in methodlarini cagiramiyorum. Her taraf include ile doldu, hatta include guard bile ekledim ama hata yinede degismiyor. Hata ayni "error C2065: 'Form1' : undeclared identifier". Her zaman bu hata geliyor undeclared identifier. O zaman nasil declare edecegimide soyle bari.:p Sanirim editore halen alismis degilim. Kusura bakmayin ama bu microsoftun seylerini bir turlu sevemedim. Eclipse kullandiktan sonra ise dahada berbat oluyor. Eclipsede fix error diye bir fonksiyor var, neredeyse benim yerimede kod yazacak:sus: Bu editor ise tipki yavan bir ekemek yermisim gibi. :DSanirim biraz daha ugrasmam lazim.
Yardimlariniz icin cok tesekkur ederim. Ama buradaki arkadas toplulugunu sevdim ve begendim. Dedigim gibi bayagi hizlisiniz.