Bu program neden üç C ++ derleyicisi tarafından yanlışlıkla reddediliyor?


468

Yazdığım bir C ++ programını derlemekte zorlanıyorum.

Bu program çok basit ve bildiğim kadarıyla C ++ Standardında belirtilen tüm kurallara uyuyor. Emin olmak için ISO / IEC 14882: 2003'ün tamamını okudum.

Program aşağıdaki gibidir:

resim açıklamasını buraya girin

Visual C ++ 2010 ile bu programı derlemeye çalışırken aldığım çıktı:

c:\dev>cl /nologo helloworld.png
cl : Command line warning D9024 : unrecognized source file type 'helloworld.png', object file assumed
helloworld.png : fatal error LNK1107: invalid or corrupt file: cannot read at 0x5172

Dezavantajlı, g ++ 4.5.2 denedim, ama aynı derecede yararsızdır:

c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status

Clang'ın (sürüm 3.0 trunk 127530) çalışması gerektiğini düşündüm, çünkü standartlara uygunluğu için çok övgü aldı. Ne yazık ki, bana güzel, vurgulanan hata mesajlarından birini bile vermedi:

c:\dev>clang++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
clang++: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

Dürüst olmak gerekirse, bu hata mesajlarından herhangi birinin ne anlama geldiğini gerçekten bilmiyorum.

Diğer birçok C ++ programı .cpp uzantılı kaynak dosyalara sahiptir , bu yüzden belki de dosyamı yeniden adlandırmam gerektiğini düşündüm. Adını helloworld.cpp olarak değiştirdim , ancak bu yardımcı olmadı. Clang'da çok ciddi bir hata olduğunu düşünüyorum çünkü yeniden adlandırılan programı derlemek için kullanmaya çalıştığımda, ters çevirdi, "84 uyarı ve 20 hata üretildi" yazdırdı. ve bilgisayarımı çok fazla bip sesi çıkardı!

Burada neyi yanlış yaptım? C ++ Standardının bazı kritik kısımlarını kaçırdım mı? Yoksa her üç derleyici de bu kadar basit bir programı derleyemeyecek kadar kırılmış mı?

Yanıtlar:


173

Standartta §2.1 / 1 şunları belirtmektedir:

Fiziksel kaynak dosya karakterleri, gerekirse uygulama tarafından tanımlanmış bir şekilde temel kaynak karakter kümesine (satır sonu göstergeleri için yeni satır karakterleri tanıtarak) eşlenir.

Derleyiciniz bu biçimi desteklemiyor (diğer adıyla temel kaynak karakter kümesiyle eşlenemiyor ), bu nedenle başka işleme aşamalarına geçemez, dolayısıyla hata. Derleyicinizin görüntüden temel kaynak karakter kümesine eşleştirmeyi desteklemesi tamamen mümkündür, ancak zorunlu değildir.

Bu eşleme uygulama tanımlı olduğundan, desteklediği dosya biçimlerini görmek için uygulama belgelerinize bakmanız gerekir. Genellikle, her büyük derleyici satıcısı (kanonik olarak tanımlanmış) metin dosyalarını destekler: bir metin düzenleyici tarafından üretilen herhangi bir dosya, genellikle bir dizi karakter.


C ++ standardının C standardını (§1.1 / 2) temel aldığını ve §1.2'deki C (99) standardının şunları söylediğini unutmayın:

Bu Uluslararası Standart,
C programlarının bir veri işleme sistemi tarafından kullanılmak üzere dönüştürüldüğü mekanizmayı belirtmez ;
- C programlarının bir veri işleme sistemi tarafından kullanılmaya çağrıldığı mekanizma;
- giriş verilerinin bir C programı tarafından kullanılmak üzere dönüştürüldüğü mekanizma;

Yani, yine, kaynak dosyalarının tedavisi derleyici belgelerinizde bulmanız gereken bir şeydir.


23
En iyi ihtimalle cümlenin belirsiz olduğunu düşünüyorum. Merriam-Webster sözlüğü söylüyor metin olan özgün kelime ve yazılı veya basılı eserin formu veya bu metni içeren bir çalışma . Bu kaynak dosya açıkça bu tanımın altındadır. Temel Dil Çalışma Grubu'na bir kusur raporu sunmam gerektiğini düşünüyor musunuz?
James McNellis

15
Ah; Referans verilen tüm belgeleri okumayı tamamen unuttum. Bununla birlikte, paragrafın bağlamdan çıkarıldığını düşünüyorum, bu yüzden ISO / IEC 9899: 1990'ın tamamını okuyacağım ve tam olarak anladıktan sonra buraya geri göndereceğim.
James McNellis



211

Sizin <ve >, (ve ), {ve }çok iyi maç için görünmüyor; Onları daha iyi çizmeyi deneyin.


44
El yazımla dalga geçmenizi takdir etmese de, bu gerçek bir sorun olabilir ve yeniden adlandırılan helloworld.cpp dosyasını Visual C ++ ile derlemeye çalıştığımda aldığım hatayı açıklar : "önemli hata C1004: beklenmedik sonu - dosyası bulundu "Tekrar deneyeceğim ve kısa süre sonra tekrar rapor vereceğim. Teşekkürler!
James McNellis

37
@ James, tüm png optimizasyonlarını kapattığınızdan emin olun. hata ayıklamayı kolaylaştırır.
wilhelmtell

5
@James: "beklenmeyen dosya sonu" neredeyse kesinlikle }soruna neden olan sizin olduğu anlamına gelir . Bunu{
Carson63000

156

Aşağıdaki python komut dosyasını deneyebilirsiniz. PIL ve pytesser kurmanız gerektiğini unutmayın .

from pytesser import *
image = Image.open('helloworld.png')  # Open image object using PIL
print image_to_string(image)     # Run tesseract.exe on image

Kullanmak için şunları yapın:

python script.py > helloworld.cpp; g++ helloworld.cpp

110

Comic Sans'ı yazı tipi olarak kullanmayı unuttun, bu yüzden hata yapıyor.


73
Ne yazık ki, elimin desteklediği tek yazı tipi bu. Bu nedenle C ++ programlayamazsam çok üzücü olur. Java'nın bu yazı tipini destekleyeceğini düşünüyor musunuz?
James McNellis

8
Yine de çizgi roman çizmeyi düşündüğünüzde Comic Sans'e ihtiyacınız olacak, bu yüzden elleri yükseltmeyi ciddiye almalısınız.
sharptooth

8
C ++, yıl boyunca hat eğitimi gerektirir. Zamanınız yoksa, Visual Basic veya sadece ikili makine kodunu deneyin (O zaman sadece 0 ve 1 almak zorundasınız).
Frank Osterfeld

1
@Frank C ++ 0x §42.1 / 1 "Tüm dizeler Gotik olmalıdır" belirtir.
Mateen Ulhaq

75

O son ayraçtan sonra yeni bir çizgi göremiyorum.

Bildiğiniz gibi: "Boş olmayan bir kaynak dosya yeni satır karakteri ile bitmezse, ... davranış tanımsızdır".


16
Hmmm. Neyse ki bu saçma kural C ++ 0x'de kaldırıldı. Bununla birlikte, böyle bir dosyayı yeni satırla nasıl bitirir? Metnin sonunda yeterli yer bıraktığımı sanıyordum (eğer kaynak dosyayı vurgularsanız, bıraktığım ekstra odayı görmelisiniz). Yine de bahşiş için teşekkürler!
James McNellis

8
Yeterli boşluk yoksa sistemimde derlemeyi deneyebilirim. Dört monitörüm var, böylece en soldaki monitörden derlemeyi deneyebilirim.
Kalay Adam

74

Bu program geçerli - Hata bulamıyorum.

Sanırım makinenizde bir virüs var. Sürücünüzü yeniden biçimlendirmeniz ve işletim sistemini yeniden yüklemeniz en iyisidir.

Bunun nasıl çalıştığını veya yeniden yükleme konusunda yardıma ihtiyacınız varsa bize bildirin.

Virüslerden nefret ediyorum.


17
Evet, Linux'u yüklemeyi deneyin. Sorununuz için Windows'u suçluyorum.
Raedwald

62

Gerçekten siyah olduğunda güzel görünse de, kodumu sihirli bir işaretleyici ile monitörün camına yazmama yardımcı olduğunu buldum. Ekran çok hızlı dolar ve temiz bir monitör veren insanlar bana her hafta isim verir.

Birkaç çalışanım (ben bir menajerim) bana topuzlarla o kırmızı ped bilgisayarlardan birini satın almak için chipping. İşaretçilere ihtiyacım olmayacağını ve dolduğunda ekranı kendim temizleyebileceğimi söylediler ama sallarken dikkatli olmalıyım. Bu şekilde hassas olduğunu sanmıştım.

Bu yüzden akıllı insanları işe alırım.


2
Bir Wacom Cintiq bir yönetici için çok daha uygundur. Pahalıdır ve sizi gerçekten önemli hissettirir. Şirketinizdeki tüm grafik tasarımcıların durumu daha düşük olacaktır ve bu nedenle EGA monitörleri kullanmalıdır. Kapıcılar CGA monitörlerini kullanmalıdır. Programcılar ikinci el monokrom terminaller kullanmalıdır.
Steve314

7
Uzun zamandır "Yaşam Gibi" bir monitörüm vardı. Öylesine gerçekçi ki, yüzme balıklarının ekran koruyucusunun gerçek olduğuna yemin ettin ve küçük dalgıç adam yüzüyormuş gibi görünüyordu. Hazin sandığını alttan almaya çalışırken kolumu ıslatmaya devam ettim, çok gerçekti. Tek sorun ekran koruyucu her zaman açıktı ve gerçekçi köpüren sesler duymak zor oldu. Oh, ve onlar bakım için günlük monitörün üstüne şeyler serpmek zorunda kaldı ya da ekran koruyucu çalışmayı durdurmak söyledi. Bunu bir kez yaptı ve iki gün sonra koku gerçekten gerçekçi oldu.
Tin Man

59

File format not recognizedDosyanızı doğru şekilde biçimlendirmeniz gerekir. Bu, kodunuz için doğru renkleri ve yazı tiplerini kullanmak anlamına gelir. Bu renkler derleyici arasında değişiklik gösterdiğinden, her derleyici için özel belgelere bakın;)


14
Oh, bu tür bir anlam ifade ediyor ... 96 boya kalemi kutum var, bu yüzden doğru ön plan rengine sahip olduğumdan eminim. Yarın renkli bir inşaat kağıdı alacağım ve farklı bir kağıt renginde deneyeceğim.
James McNellis

3
Sadece güvende olmak için, bazı boyama kalemleri ve yağ bazlı boyalar alsanız iyi olur. C ++ 'nın doğru biçimlendirmek için çok zor bir dil olduğu iyi bilinen bir gerçektir.
helloworld922

Yeap ve vurgulama işaretleyicisini kullanmayı unutmayın.
sharptooth

6
@sharptooth - sözdizimi vurgulama bir IDE özelliğidir - bunu elle yapmak istemezsiniz. Bu vurgulayıcı işaretleyici ile bir robot kolu aldığınızdan emin olun.
Steve314

56

Ön işlemciyi unuttunuz. Bunu dene:

pngtopnm helloworld.png | ocrad | g++ -x 'c++' -

8
Ah! Önişlemcinin derleyiciye dahil olduğunu düşündüm! Windows dizüstü bilgisayarımda çalışan bir önişlemci bulmaya çalışacağım.
James McNellis

3
@James McNellis: Önişlemci bir program değil, vurgulayıcı bir işarete benzeyen donanımsal bir şeydir - metninizin üzerine taşırsınız ve önceden işlenir.
sharptooth

49

Programı el yazısıyla bilgisayara mı taradınız? "Helloworld.png" tarafından ima edilen budur. Bu durumda, C ++ standardının (en yeni sürümünde bile) optik karakter tanıma gerektirmediğini ve maalesef mevcut herhangi bir derleyiciye isteğe bağlı bir özellik olarak dahil edilmediğini bilmeniz gerekir.

Grafikleri metin biçimine aktarmayı düşünebilirsiniz. Herhangi bir düz metin düzenleyicisi kullanılabilir; güzel bir çıktı üretme yeteneğine sahip olsa da, bir kelime işlemcinin kullanılması büyük olasılıkla taramaya çalışırken aldığınız hataya neden olur.

Gerçekten maceracıysanız, kodunuzu bir kelime işlemciye yazmaya çalışabilirsiniz. Tercihen OCR-A gibi bir yazı tipi kullanarak yazdırın . Ardından, çıktınızı alın ve yeniden tarayın. Daha sonra tarama, bir metin formu oluşturmak için üçüncü taraf bir OCR paketi üzerinden çalıştırılabilir. Metin formu daha sonra birçok standart derleyiciden biri kullanılarak derlenebilir.

Bununla birlikte, bu hata ayıklama aşamasında ortaya çıkacak büyük kağıt maliyetine dikkat edin.


Tavuk ve yumurta ikilemi: OCR yazılımı için C ++ kodu yazmak ve OCR olmadan derlemek mümkün müdür?
jweyrich

5
Aslýnda, orijinal OCR için montaj kullanýyorsun.
Kevin Lacquement

@jweyrich - Sanırım önce C ++ / OCR önyüklemenizi asm / OCR araç zincirinizle doldurmanız gerekecek.
Michael Burr

2
Oh ASM, evet! Delikli kartlarda ASM .
jweyrich

46

Derlemek için aşağıdakileri çizin:

#include <ChuckNorris>

Sözdizimi hatalarını derleyebildiğini duydum ...


46
Şahsen tercih ederim #include <JonSkeet>.
Icode4food

40

Ne yazık ki, sadece C ++ değil, birden çok dili destekleyen üç derleyici seçtiniz. Hepsinin kullandığınız programlama dilini tahmin etmesi gerekir. Muhtemelen bildiğiniz gibi, PNG formatı sadece C ++ için değil, tüm programlama dilleri için uygundur.

Derleyici genellikle dilin kendisini bulabilir. Örneğin, PNG açıkça boya kalemi ile çizilirse, derleyici Visual Basic içerdiğini bilecektir. Mekanik bir kurşun kalemle çizilmiş gibi görünüyorsa, FORTRAN kodu yazarak işteki mühendisi tanımak kolaydır.

Bu ikinci adım bu durumda derleyiciye de yardımcı olmaz. C ve C ++ sadece çok benzer görünüyor #include. Bu nedenle, derleyicinin gerçekten hangi dilde olduğuna karar vermesine yardımcı olmalısınız. Artık standart olmayan araçlar kullanabilirsiniz. Örneğin, Visual Studio derleyicisi / TC ve / TP komut satırı bağımsız değişkenlerini kabul eder veya proje dosyasındaki "Farklı derleme: C ++" seçeneğini kullanabilirsiniz. GCC ve CLang'ın bilmediğim kendi mekanizmaları var.

Bu nedenle, derleyicinize aşağıdaki kodun C ++ 'da olduğunu söylemek için standart yöntemi kullanmanızı öneririm. Şimdiye kadar keşfettiğiniz gibi, C ++ derleyicileri kabul ettikleri konusunda çok seçici. Bu nedenle C ++ 'ı tanımlamanın standart yolu, programcıların C ++ kodlarına ekledikleri yıldırmadır. Örneğin, aşağıdaki satır derleyicinize aşağıdaki şeyin C ++ olduğunu açıklar (ve şikayetleri olmadan derlemesi daha iyi olur).

// To the compiler: I know where you are installed. No funny games, capice?

10
#pragmaDerleyiciye "mesaj almanın" doğru yolu olduğunu düşündüm.
Lev Bishop

33

Bunu dene:

Uzay mekiğinde dinozoru görüyor musun?


4
Bence bir yazım hatası var - endl(L) değil end1( L) olmalı . Ama +1 güzel yapılır!
Rup

44
Ben üç saat boyunca bu bakıyorum ama hala bir dinozor veya uzay mekiği göremiyorum. :-(
oosterwal

32

Derleyiciniz uzman modunda mı ayarlanmış ?! Evet ise, derlememelidir. Modern derleyiciler "Merhaba Dünya!"


27

OCR diyor ki:

N lml_e <loJ+_e__}

.lnt Mk.,n ( ln+ _rSC Lhc_yh )
h_S_
_l

s_l . co__ <, " H llo uo/_d ! '` << s l . ena_ .
TP__rn _ |
_|

Bu oldukça iyi, adil olmak.


4
Vay, el yazımı taramaya çalıştığımdan beri OCR gelişti (düz yazarak saatler harcadım).
James P.

40
Sanırım bir Perl etiketi eklememiz gerekiyor.
MSalters

26

helloworld.png: dosya tanınmadı: Dosya biçimi tanınmadı

Açıkçası, sabit diskinizi biçimlendirmelisiniz.

Gerçekten, bu hataları okumak o kadar da zor değil.


20

Programınızı PNG'den ASCII'ye dönüştürdüm, ancak henüz derlenmedi. Bilginiz için, satır genişliği 100 ve 250 karakterle denedim, ancak her ikisi de karşılaştırılabilir sonuçlara ulaştı.

   `         `  .     `.      `         ...                                                         
   +:: ..-.. --.:`:. `-` .....:`../--`.. `-                                                         
           `      `       ````                                                                      
                                                                      `                             
   ` `` .`       ``    .`    `.               `` .      -``-          ..                            
   .`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :                            
   .`         ` `    ` .`         ````:``  -                  ` ``-.`  `                            
   `-                                ..                           ``                                
    .       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `       
           `:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `     
            ``  `       ```.      ``    ````    `       `     `        `    `         `   `   .     
            : -...`.- .` .:/ `                                                                      
    -       `             `` .                                                                      
    -`                                                                                              
    `                                                                                               

8
Muhtemelen bunun yerine 80 hatta 72 sütun kullanmalısınız
Tobias Kienzler

16

İlk sorun, ana işlevin sonunda yanlış bir değer döndürmeye çalışmanızdır. C ++ standardı, main () dönüş türünün int olduğunu belirtir, ancak bunun yerine boş kümeyi döndürmeye çalışıyorsunuz.

Diğer sorun - en azından g ++ ile - derleyicinin dosya sonekinden kullanılan dili çıkarmasıdır. G ++ (1) 'den:

Herhangi bir girdi dosyası için, dosya adı soneki ne tür bir derleme yapıldığını belirler:

file.cc dosya.cp dosya.cxx dosya.cpp dosya.CPP dosya.c ++ dosya.C

Önceden işlenmesi gereken C ++ kaynak kodu. .Cxx dosyasında, son iki harfin her ikisinin de kelimenin tam anlamıyla x olması gerektiğini unutmayın. Benzer şekilde, .C değişmez bir sermaye C'yi ifade eder.

Bunları düzeltmek, burada demodan görülebileceği gibi, tamamen çalışan bir Hello World uygulamasıyla sizi terk etmelidir .


3
Sıfır sıfır kümesi olmadığından sıfır basamağı ile eğik çizgi yaparsanız, ödevinizi veya sınavlarınızı kimin alacağı bir profesör vardı. Bu cevabı takdir edecekti.
Michael Burr

15

Yazı tipiniz berbat, ayrıştırıcı bunu nasıl okuyabilmelidir? Bir hat kursuna katılın.


13

Derleyicileriniz ASCII bekliyor , ancak bu program açıkça EBCDIC kullanılarak yazılıyor .


En son C ++ programlarının ASCII, UTF-8 veya başka bir şeyle yazılması gerektiğini belirtmediğini duydum.
Adrian Ratnapala

8

Bir görüntü derlemeye çalışıyorsunuz.

Main.cpp adlı bir belgeye el ile yazdıklarınızı yazın, bu dosyayı derleyicinizden çalıştırın, ardından çıktı dosyasını çalıştırın.


23
PC'nizdeki tarihi kontrol edin.
James P.

14
Haha, ama sonunda cevaplayabileceğim kolay bir tane buldum!
Cody Gray

10
Bu aptalca. Hepimiz derleyicinin beyaz alanı optimize edeceğini biliyoruz, sadece hepsi sıkıştırılmış ve hata olarak döndürülecek bir ikili 1'e sıkıştırılacak olan yoğun şekilde sıkıştırılmış siyah alan bırakıyor. Kodun 0'a derlenip hata döndürmeyecek beyaz renkle yazılması gerekiyordu.
Kalay Adam

7

Son kapanış kümesinden hemen önce çıktınızın önünde iki nokta üst üste karakterinizin kesinliğini belirtmeniz gerekir . Çıktı sayısal olmadığından hassasiyet sıfırdır, bu yüzden buna ihtiyacınız vardır-

: 0}


5

Ekle :

using namespace std;

hemen sonra şunları içerir: P: D


5
Her stdzaman yazmayı tercih ederim . Bana bir tane almamamı hatırlatıyor.
Mateen Ulhaq

5

Derleyicinizin bu hmm ... kodlamasındaki dosyaları desteklemediği anlaşılıyor. ASCII'ye dönüştürmeyi deneyin.


5

Sorun sözdizimi tanımı ile yatmaktadır, daha klasik bir açıklama için cetvel ve pergel kullanmayı deneyin!

Alkış,


5

Giriş arayüzünü değiştirmeyi deneyin. C ++, bir klavyenin tarayıcıya değil bilgisayarınıza takılmasını bekler. Burada çevre birimleriyle ilgili çatışma sorunları olabilir. Klavye giriş arayüzünün zorunlu olup olmadığını ISO Standardında kontrol etmedim, ancak bu şimdiye kadar kullandığım tüm derleyiciler için geçerlidir. Ancak belki tarayıcı girişi C99'da kullanılabilir ve bu durumda programınız gerçekten de çalışmalıdır. Değilse, derleyicilerin bir sonraki standart sürümünü ve yükseltmesini beklemeniz gerekir.


5

Köşeli ayraçlar için farklı renkler deneyebilirsiniz, belki bazı yeşil veya kırmızı yardımcı olabilir? Derleyiciniz siyah mürekkebi tanıyamaz: P


5

'Dönüş' ile noktalı virgül arasındaki karakteri tanıyamayan tek kişi ben miyim? Bu olabilir!


4
"Çap" dediğimiz, derleyiciye Midpoint Circle Algoritmasını açık bir şekilde kullanmasını söyleyen özel bir satıra sahip büyük bir O harfi. Bence gözlerini kontrol ettirmelisin.
Mateen Ulhaq
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.