利用規約の変更について

perl/tkとtcl/tkの違いを知りたい。
例えば、文法の違いだとか、互換性だとか、拡張性とかを
知りたい。宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

tkというのは、GUIのライブラリで、


それを、perlとかtclとかいった言語から使えるようにしたのが、perl/tk、tcl/tkです。

perlとtclは、全く違う言語ですから、文法は全く違いますし、互換性は全くありません。
ただ、tkという同じGUIライブラリを使用しているので、ライブラリの呼び出し方などはほぼ同じです。
    • good
    • 0
この回答へのお礼

メッセージボックスと言うのは、一つのテキストボックスしか与えられ
ないのでperl/tkを使う事を考えていますが。近くの図書館に有るの
は、tcl/tkばかりでperl/tkその物が無かったので、どこを参考にした
ら良いのかが分かりませんでした。

ライブラリーの呼び出しだけの違いでしょうか。ネット上で参考になる
所が有れば良かったのですが。余り無い様でしたので、tcl/tkを思いつ
いたのですが。

何処がどう違うのかと言うのが、perl/tkの理解に影響をするので気に
なっていました。そこだけを気を付けて、tcl/tkをざっくりと見てみま
す。

有難う御座いました。

お礼日時:2017/02/22 09:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qmakeで文字化けする。migwのmakeを使っています。

makeで文字化けをする。
mingwのmakeを使っています。

makeの設定の問題でしょうか。
環境はWindows7です。

宜しく回答願います。

Aベストアンサー

https://ja.wikipedia.org/wiki/Gettext
makeが各言語で表示されるしくみは、これ。

うろ覚えですが、MinGWでは、jaに対応している make.mo は、 ja_JP.EUC 用しかなかったように思います。
端末がSJISでは文字化けします。
たしか、他のコマンドも .moはEUC用だったはずです。

対策は次の通りです。
○ 日本語表示を止める
 ・LANG=C 等、日本語表示しない設定にする
 ・LANG=ja_JP.SJIS 等、コードも含めて設定する→SJISにすれば、EUCは使われない
 ・locale/ja/LC_MESSAGES/make.mo を削除する
○EUC使用で統一する
 ・chcpコマンドでコマンドプロンプトのコードをEUCに変える(他にどんな影響が出るか不明)
 ・cmd.exeではなく、(MinGW/MSYSの) bashを使う
○ja_JP.SJIS用 make.mo を作る
 ・ locale/ja/LC_MESSAGES/make.mo と差し替える
 ・ locale/ja_JP.SJIS/LC_MESSAGES/make.mo に置く

影響が少ないのは、環境変数LANGを変更することでしょう。

https://ja.wikipedia.org/wiki/Gettext
makeが各言語で表示されるしくみは、これ。

うろ覚えですが、MinGWでは、jaに対応している make.mo は、 ja_JP.EUC 用しかなかったように思います。
端末がSJISでは文字化けします。
たしか、他のコマンドも .moはEUC用だったはずです。

対策は次の通りです。
○ 日本語表示を止める
 ・LANG=C 等、日本語表示しない設定にする
 ・LANG=ja_JP.SJIS 等、コードも含めて設定する→SJISにすれば、EUCは使われない
 ・locale/ja/LC_MESSAGES/make.mo を削除する
○EUC使用で...続きを読む

QC言語の漢字のホルダーは、chdirでは変更出来ないのだろうか。

下記のソースでは、ホルダーが漢字で無い時は成功するが。
漢字を使うと失敗する。

下記に成功する場合を示す。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(){
char *dir1="C:/Users/usui/mingw";
int ret;

ret=chdir(dir1);
printf("%d\n",ret);
}
上記は、漢字を使っていないので結果は0を表示する。
然し、ホルダーに漢字を使うと-1を表示する。

漢字のホルダーを使う方法をお知えて下さい。
宜しくお願いします。

Aベストアンサー

No3です。
ちなみに私がインストールした(今使っているバージョン)のは、下記URLの
mingw-get-inst-20120426.exe です。
https://sourceforge.net/projects/mingw/files/OldFiles/mingw-get-inst/mingw-get-inst-20120426/

QC言語でのUTF-8の文字列の処理は例えば、比較とかstrtokとかはどうするのか

大量のhtmlファイルを処理をする様になってから今迄はperlを使って来
たが処理が遅いのでC言語を使って早くしようと思って要るが。肝心の
日本語コードの扱いで詰まっている。

例えば、
<!--コメントヘッダーのはじまり-->
.
.
.
<!--コメントヘッダーのおわり-->
と言った場合に、<と>に囲まれた色んなタグが現れて来る。strtokで文
字列を拾って対処をするとしても、文字コードが処理出来なければ何も
進まない。

例えば、上記の場合でhtmlファイルを読んでコメントヘッダーのはじまり
とおわり迄に関しては、出力をしない。他のは全て出力すると言う様な場
合のC言語のソースはどの様に成るのでしょうか。

済みません。未だ、始めたばかりでC言語での記述が出来ません。宜し
く回答願います。

回答はヒントでは無くて直接のC言語のソースを提示願います。宜しく
お願いします。

Aベストアンサー

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られたバッファでやりくりしようとするなら(ネットワークからダウンロードしながら処理する際にはこのやり方が必須)、バッファ読み込みの際のタグ文字列の泣き別れなどを考慮する必要がありちょっと凝ったテクニックが必要になります。

それとも、UTF-8で書かれたHTMLの"<!--コメントヘッダーのはじまり-->"~"<!--コメントヘッダーのおわり-->"を全削除ですか?だったら、コードをUTF-8で書いて、strstr()で"<!--コメントヘッダーのはじまり-->”を見つけて・・・でいけると思います。文字コードの処理というよりか、見る人が見れば日本語に見えるかもしれない「ただのデータの列」とみなして処理するだけです。

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られた...続きを読む

Qperlの無名配列の使い方を教えて下さい。

メールヘッダーの解析をリファレンスを使っているが、上手く出来な
い。理由は、無名配列を使っていない為に常に最後のデータでで上書き
される為。ここで、無名配列を使った方法が良く分からない。

メールヘッダーの構造は下記の通り。
① 最初にヘッダー、次がデータの順で構成されている。
② ヘッダーの開始は、Return-Path:から始まる。
③ ヘッダーの終わりは、空行。/^$/
④ データの開始は、ヘッダーの終わりの空行の次の行から開始する。
⑤ データの終わりは先頭のピリオドのみのデータ /^\.$/

上記の構成で、ヘッダーを配列@headerにデータを@dataに入れる。
ここでは、常に最初は@headerに次は@dataに交互に格納される。

@headerと@dataには、複数行のデータを配列のリファレンスとして格納
する。今の状況は夫々@headerと@dataには確かにリファレンスは格納さ
れているが。無名配列を使っていない為に、常に最後のデータしか格納
されていない。

ここでは、@headerの要素の@header_lineと@dataの要素の@data_lineへ
のデータの格納が不味い。ここの所をどの様にして無名配列を使ったら
良いのか、指摘をお願いします。

宜しく回答願います。

なお、今の不具合が発生をしているperlのソースを掲載します。これは
無名配列を使っていません。そこから、上記のバグが発生をしていま
す。

このソースを無名配列を使ったやり方に変更をしたい。宜しく回答願い
ます。また、これに関しては一番簡単な方法と言うのは、use strrict
宣言をしてから、夫々の@header_lineと@data_lineにmyの宣言をすれば
良いとは分かっていますが。

それ以外の方法での解決をお願いします。この手の問題と言うのは、私
は余りリファレンスを使う事が無いので。これを機会にして一つの定石
にしたいと思っていますので。宜しくお願いします。

長々と長い質問になりましたが宜しくお願いします。

下記の問題のperlのソースを掲載します。宜しくお願いします。

@header=();
@data=();
while(<>){
if(/^Return-Path:/){
$flag="header";
@header_line=();
$tmp=join("->",$.,$_);
push @header_line,$tmp;
next;
}

if($flag eq "header"){
if(/^$/){
$tmp=join("->",$.,"<blank>\n") ;
push @header_line,$tmp;
push @header,\@header_line;
$flag="data";
@data_line=();
next;
}
}

if($flag eq "data"){
unless(/^\./){
$tmp=join("->",$.,$_);
push @data_line,$tmp;
next;
}else{
$tmp=join("->",$.,$_);
push @data_line,$tmp;
push @data,\@data_line;
next;
}
}
}

for $i(0 .. 2434){
@ref_header=@{$header[$i]};
print @ref_header;
@ref_data=@{$data[$i]};
print @ref_data;
}

メールヘッダーの解析をリファレンスを使っているが、上手く出来な
い。理由は、無名配列を使っていない為に常に最後のデータでで上書き
される為。ここで、無名配列を使った方法が良く分からない。

メールヘッダーの構造は下記の通り。
① 最初にヘッダー、次がデータの順で構成されている。
② ヘッダーの開始は、Return-Path:から始まる。
③ ヘッダーの終わりは、空行。/^$/
④ データの開始は、ヘッダーの終わりの空行の次の行から開始する。
⑤ データの終わりは先頭のピリオドのみのデータ /^\.$...続きを読む

Aベストアンサー

$r = [] ;

{my @ary = () ; $r=\@ary ;}
と(ほぼ)同じです。

$r = [1,2,3] ;

{my @ary = (1,2,3) ; $r=\@ary ;}
と同じです。

と、考えれば
$r = [ @list ] ;

{my @ary = (@list) ; $r=\@ary ;}
と同じ、ということになります。

このときの、 @ary と @list の関係がどうなっているか、よく考えてみましょう。
print \@ary , \@list ;
とかやってみてもいいでしょう

http://perldoc.jp/docs/perl/5.14.1/perldata.pod#List32value32constructors
が参考になります。


> use strrict 宣言をしてから、夫々の@header_lineと@data_lineにmyの宣言

use strrict と my は直接関係はありません。

http://perldoc.jp/func/my
myは「ローカル変数」を定義するためのものです。
use strict とは関係無く利用できます。

http://perldoc.jp/docs/perl/5.12.3/strict.pod
use strict あるいは use strict "vars"; は、未定義の変数を使えないようにするもので、
結果 my を使うことが多くなりますが、他の手段の方が好ましいこともあります(our とか)


「よいプログラム」の作り方として
・グローバル変数は使わない
・ローカル変数も、できるだけ有効範囲を狭くする
というのがあります。

Perlでも
・そのままではグローバルになるので、my を着ける
・my を忘れないようにuse strict を使う
というのが、昨今の流れです。

$r = [] ;

{my @ary = () ; $r=\@ary ;}
と(ほぼ)同じです。

$r = [1,2,3] ;

{my @ary = (1,2,3) ; $r=\@ary ;}
と同じです。

と、考えれば
$r = [ @list ] ;

{my @ary = (@list) ; $r=\@ary ;}
と同じ、ということになります。

このときの、 @ary と @list の関係がどうなっているか、よく考えてみましょう。
print \@ary , \@list ;
とかやってみてもいいでしょう

http://perldoc.jp/docs/perl/5.14.1/perldata.pod#List32value32constructors
が参考になります。


> use strrict 宣言をしてから...続きを読む

Qしつこい様ですが、再度ポインタについて質問します。

下記は、*inの<title>から<と>で挟まれたtitle
を得るためのソースです。
全くの完全では有りませんが。質問の内容は、
while文の中で、コンパイラーが出すエラーメッセージの
内容が理解出来ません。

下記が出ます。
01.c: In function 'main':
01.c:12:17: warning: assignment makes pointer from integer without a cast [enabled by default]
while(strstr((p=(*out++ = *in++)),">") !=0);
^
while文の中でのエラーで、キャスト無しの整数からポインターを作っているので
strstrの最初の引数を飛ばしました(デフォルトで有効)無視しました。と言う意味ですが。

要はこれはポインターで無いのでstrstrの引数としては無効ですと言う事でしょうか。
それであれば、ここではポインターに変換しないといけませんが。

実はこれに関しては、前の質問でその方法と言うのは分かったのですが。どうしても、ここでは
将来の勉強と言う意味で理解をしたかった物ですから質問をしました。

このエラーメッセージが出ない様にするためにはソースのどこを変更
すれば良いのでしょうか。今度は、コードがどうのこうのではなくて
説明をお願いします。

よろしくお願いします。後学の為にどうしても理屈を知りたかった物ですから。
宜しくお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=work;
char *p;

while(strstr((p=(*out++ = *in++)),">") !=0);
*out='\0';
printf("%s",work);

return 0;
}

下記は、*inの<title>から<と>で挟まれたtitle
を得るためのソースです。
全くの完全では有りませんが。質問の内容は、
while文の中で、コンパイラーが出すエラーメッセージの
内容が理解出来ません。

下記が出ます。
01.c: In function 'main':
01.c:12:17: warning: assignment makes pointer from integer without a cast [enabled by default]
while(strstr((p=(*out++ = *in++)),">") !=0);
^
while文の中でのエラーで、キャスト無しの整数からポイ...続きを読む

Aベストアンサー

No1です。
>これを作るに当ってのプログラム作成の問題は解決をしていますので。
>最後に今回の説明の回答で暴走すると言う所が気になっています。
>最後にこの暴走と言う所の質問の回答をお待ちしています。

これを以下のような部分を追加しました。
追加したしたのは、変数の内容を印字するだけなので、本来の動作には影響しません。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=work;
char *p;

printf("ascii code of(<)=%d\n",'<');
printf("in_size=%d out_sieze=%d\n",sizeof(in),sizeof(out));
printf("in=%x out=%x\n",in,out);

while(strstr((p=(char*)(int)(*out++ = *in++)),">") != 0);
*out='\0';
printf("%s",work);

return 0;
}
----------------------------------
これを実行すると、添付の図のようになります。
OSにより強制終了させられます。
このように強制終了させられる原因はいろいろありますが、今回は
ROM領域をアクセスしているのが原因と考えられます。
まず、pのあたいですが、"<"のアスキーコードの値:60が設定されます。
strstr(p,">")の意味は、60番地から">"の文字列が存在する箇所を探しなさい。
ということになります。60番地はROMの領域になるはずで、OSはこのような領域を一介のアプリプログラムが
アクセスすることを禁止しています。その為、強制終了させられます。(これが暴走の意味です)
通常、pは、アプリケーションプログラムが確保した領域のアドレスが設定されるはずで、
inのアドレスが設定されるなら、添付の図のように403064(16進数)のような値になるはずです。

No1です。
>これを作るに当ってのプログラム作成の問題は解決をしていますので。
>最後に今回の説明の回答で暴走すると言う所が気になっています。
>最後にこの暴走と言う所の質問の回答をお待ちしています。

これを以下のような部分を追加しました。
追加したしたのは、変数の内容を印字するだけなので、本来の動作には影響しません。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=wo...続きを読む

Qvbsでは漢字の変数は使えないのでしょうか。

下記はエラーになります。
Option Explicit
Dim 氏名

氏名=InputBox("氏名を入力して下さい")
MsgBox(氏名)

ここで、氏名をnameに変更すると正しく実行します。
Option Explicit
Dim name

name=InputBox("氏名を入力して下さい")
MsgBox(name)

漢字の変数を使う方法は無いのでしょうか。

Aベストアンサー

もうお答えは出ているようですが、私からも回答します。

2byte 文字を変数にすると、

\kanjitest.vbs(2, 5)
「Microsoft VBScript コンパイル エラー: 文字が正しくありません。」

のエラーが出ます。
Unicode VBSにしても、やはりエラーが出ます。

もともと、String 型で認められる所以外では、2byte 文字は、ハングしますから、仕方がありません。VBAとは違いますから。
これを、HTA にして、Charset を、UTF-8 にしても、エラーは出ます。諦めることでしょうね。

QC言語で詰まっているので教えて下さい。

下記のソースが有ります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name[]="out/";
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n");
return 1;
}
// }}}
// fgetsでのエラー処理 {{{
if(fgets(buf,64000,fp) == NULL){
printf("data error\n");
return 1;
}
// }}}
// <target>が存在しない時のエラー処理 {{{
p=strstr(buf,"<target>");
if(p == NULL){
printf("target not found\n");
exit(1);
}
// }}}

// 最初のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcat(file_name,q);
// }}}

// 出力ファイルのopen処理 {{{
fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
}
// }}}
while(fgets(buf,64000,fp) != NULL){
p=strstr(buf,"<target>");
if(p == NULL){
fprintf(fp2,"%s",buf);
}else{
// 2回目以降のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcat(file_name,q);
// }}}
// 今使っているファイルを閉じて新しいファイルを開く。{{{
fclose(fp2);

fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
} // }}}
}
}
fclose(fp);
fclose(fp2);
return 0;
}

// vim:set fdm=marker:

入力は、result.txtを読んでそれをフィルターする物です。result.txt
は先頭から順に下記の内容で入力されています。

① <target>ファイル名</target>
② 内容のデータ

上記の①から②を繰り返します。フィルターは①のファイル名で続く
データをそのファイルに出力します。フィルターの数は約1万件にな
る。

処理の内容は、最初の<target>の行を読んで出力ファイルをオープンし
ます。続くデータを<target>行が来る迄出力を続行します。

新しく<target>行が来るとこれ迄使っていた出力ファイルを閉じてまた
新規のファイルを出力としてオープンします。

この処理をresult.txtを最後迄読んだら終了となります。今の問題は、
この処理の中で最初の出力ファイルに出力をしている途中で異常終了し
ます。

何処が不味いのか。検討が付きません。どうか助けて下さい。宜しくお
願いします。

下記のソースが有ります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name[]="out/";
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n");
return 1;
}
// }}}
// fgetsでのエラー処理 {{{
if(fgets(buf,64000,fp) == NULL){
printf("data error\n");
return 1;
}
// }}}
/...続きを読む

Aベストアンサー

以下のようにしてください。
修正した箇所と、追加した箇所に//変更、//追加のコメントを入れておきました。
-------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name_base[]="out/"; //変更
char file_name[256]; //追加
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n");
return 1;
}
// }}}
// fgetsでのエラー処理 {{{
if(fgets(buf,64000,fp) == NULL){
printf("data error\n");
return 1;
}
// }}}
// <target>が存在しない時のエラー処理 {{{
p=strstr(buf,"<target>");
if(p == NULL){
printf("target not found\n");
exit(1);
}
// }}}

// 最初のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcpy(file_name,file_name_base); //追加
strcat(file_name,q);
// }}}

// 出力ファイルのopen処理 {{{
fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
}
// }}}
while(fgets(buf,64000,fp) != NULL){
p=strstr(buf,"<target>");
if(p == NULL){
fprintf(fp2,"%s",buf);
}else{
// 2回目以降のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcpy(file_name,file_name_base); //追加
strcat(file_name,q);
// }}}
// 今使っているファイルを閉じて新しいファイルを開く。{{{
fclose(fp2);

fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
} // }}}
}
}
fclose(fp);
fclose(fp2);
return 0;
}
----------------------------------------------------
誤りは2点です。
1)strcat(file_name,q);
file_nameは"out/"が格納できるサイズしか確保されません。
その為、これを実行すると、確保したサイズ以降の領域が破壊されます。
どこが、破壊されるかは、コンパイラの配置によってきまるので、わかりませんが、どこかが破壊されます。
2)2回目のstrcat(file_name,q);を実行すると
前に実行した残骸のあとから更に文字列が追加されます。

上記を解決するためには
char file_name_base[]="out/"; //変更
char file_name[256]; //追加
を確保し、
一旦、
①file_name_baseをfile_nameにコピーし、
②その後で、strcat(file_name,q);
を実行します。
①②は、必ずペアで実行します。
尚、file_nameは暫定的に256バイトにしましたが、もっとファイル名として大きな文字列が存在するなら
もっと大きくしてください。

以下のようにしてください。
修正した箇所と、追加した箇所に//変更、//追加のコメントを入れておきました。
-------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name_base[]="out/"; //変更
char file_name[256]; //追加
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n...続きを読む

Qユーザ定義型は定義されてません

こんばんは
実行すると「ユーザ定義型は定義されてません」と表示されます。
どなたかわかる方おしえてください。
Sub m()
Dim a As New NotesSession
・・・

End Sub

Aベストアンサー

参考になるかな?

セッションオブジェクトを作成する
https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_8.5.3/com.ibm.designer.domino.main.doc/H_ACCESSING_THE_DOMINO_OBJECTS_THROUGH_COM_CREATING.html

QC言語の簡単なプログラムの相談です

プログラミング初心者です。
getcharが使えなくて
困っています。
下記プログラムに"#define putchar(c) putc(c, stdout)"と”#define getchar( ) getc(stdin)”も加えたりしているのですが、結果"。"や"1"などがでてきます。(下はサンプルプログラムです)
どなたか、ご教授よろしくお願いします。





#include <stdio.h>

void main(void);

void main(void)
{
int c;

for (c = 'A'; c <= 'Z'; c++) /* c の値は 'A' から 'Z' まで変化 */
putchar(c); /* 1文字画面に出力 */

printf("\n");

for (c = 'Z'; c >= 'A'; c--) /* c の値は 'Z' から 'A' まで変化 */
putchar(c); /* 1文字画面に出力 */

printf("\n\n");

printf("アルファベットを入力して下さい\n");
printf("eを入力するとループからぬけます\t");

while ((c = getchar( )) != EOF) { /* 文字の入力 */
putchar(c);
if (c == 'e') /* 入力された文字が 'e' なら */
break; /* ループから抜ける */
}
}

プログラミング初心者です。
getcharが使えなくて
困っています。
下記プログラムに"#define putchar(c) putc(c, stdout)"と”#define getchar( ) getc(stdin)”も加えたりしているのですが、結果"。"や"1"などがでてきます。(下はサンプルプログラムです)
どなたか、ご教授よろしくお願いします。





#include <stdio.h>

void main(void);

void main(void)
{
int c;

for (c = 'A'; c <= 'Z'; c++) /* c の値は 'A' から 'Z' まで変化 */
putchar(c); ...続きを読む

Aベストアンサー

#Codeが
https://www.microsoft.com/ja-jp/store/p/code/9nblggh4s3mf
これだとすると

> #Code is an online compiler

ってあるから、最近流行りの paizaとかideoneとかみたいな感じなのではないでしょうか。
だとすると、入力は、通常のオフラインでの実行とは違っていても不思議ではありません。

Q連想配列に格納されたオブジェクトのdelete

次のコードをgcc5.4.0でコンパイルすると、

-----------------------------------------
#include <iostream>
#include <map>
using namespace std;

class samp{
};


int main(){

std::map<int, samp> sampls;


for(int i=0;i<3;i++){
samp *s = new samp();
sampls[i]=*s;
}

std::map<int, samp>::iterator it = sampls.begin();
while(it!=sampls.end()){
delete it->second;
sampls.erase(it);
it = sampls.begin();
}

return 0;
}
-----------------------------------------

以下のエラーメッセージが出力されるのですが、
どのように修正したらよいでしょうか?
test.cpp:21:16: error: type ‘class samp’ argument given to ‘delete’, expected pointer
delete it->second;

次のコードをgcc5.4.0でコンパイルすると、

-----------------------------------------
#include <iostream>
#include <map>
using namespace std;

class samp{
};


int main(){

std::map<int, samp> sampls;


for(int i=0;i<3;i++){
samp *s = new samp();
sampls[i]=*s;
}

std::map<int, samp>::iterator it = sampls.begin();
while(it!=sampls.end()){
delete it->second;
sampls.erase(it);
it = sampls.begin();
}

return 0...続きを読む

Aベストアンサー

samp クラスをコピーして問題ないなら

for(int i=0;i<3;i++){
// samp *s = new samp();
samp s; // 追加
sampls[i]=s;
}

std::map<int, samp>::iterator it = sampls.begin();
while(it!=sampls.end()){
// delete it->second;
sampls.erase(it);
it = sampls.begin();
}

諸般の事情でコピーできないのでポインタで管理したいなら

//std::map<int, samp> sampls; // 以下に変更
std::map<int, samp*> sampls;


for(int i=0;i<3;i++){
samp *s = new samp();
// sampls[i]=*s; // 以下に変更
sampls[i]=s;
}

//std::map<int, samp>::iterator it = sampls.begin(); // 以下に変更
std::map<int, samp*>::iterator it = sampls.begin();

samp クラスをコピーして問題ないなら

for(int i=0;i<3;i++){
// samp *s = new samp();
samp s; // 追加
sampls[i]=s;
}

std::map<int, samp>::iterator it = sampls.begin();
while(it!=sampls.end()){
// delete it->second;
sampls.erase(it);
it = sampls.begin();
}

諸般の事情でコピーできないのでポインタで管理したいなら

//std::map<int, samp> sampls; // 以下に変更
std::map<int, samp*> sampls;


for(int i=0;i<3;i++){
samp *s = new samp();
// sampls[i]=*s; // 以下に変更
s...続きを読む


人気Q&Aランキング

おすすめ情報