HPに努力値振り込むのと防御と特防に均等に努力値振り込むのは
どっちが防御効果高いですか?
tes
>>11 俺もそれがすごい気になってる
質問スレにHP 2:防御 1 :特防 1で振り込むのが一番硬くなるって書いてあった
どっかのスレにHP、防御、特防の努力値配分を出してくれるツールを作った香具師がいたな
sss
=6
おまえのチェックミスを棚に上げんな
禿同。はアフォ。早く削除依頼しなさい。
=10
自作自演でした。テヘッ
自作自演でした。
見ればわかります
void func(char **);
main()
{
char a[100][100];
func(a);
return 0;
}
void func(char **a)
{
}
↑のようにやったらプログラムが暴走したんですが
対処法はいかに?
void func(char a[][100])
PHP
PHPやったことないんですが・・ほんとに応用できるのですか?
int a = 4.3;
abs(3.5);
とかのミスってlintで検出できますか?
まあ、当然のことですけど
C++
C言語の感覚で書かれたC++はクソコード
誰もそんなことは聞いていない。
C++はオブジェクト指向なのになんでCが応用できるのかと小一時間(略
キター
逆にCに応用できる言語は何ですか?
awk
C++
C++言語の感覚で書かれたCはクソコード
誰もそんなことは聞いていない。
結局、CとC++は、繰り返しや比較などが同じなだけであって
設計方法は全然違うわけだな。
ありがとう。でもそこに書いてあることをほとんど
やってくれなかった。
質問!!
C言語ってDVDなどにあるプロテクトもC言語に一種ですか?
教えてください
Cでsnprintfを自作することになりました。
参考になる資料とかありましたら教えてください。
フリーで使えるソースが何処かに落ちていると良いのですが。
VC++ならCRT\SRCフォルダに。
レスどうもです。
VC++見てみたのですが、うーん難しい事してるんですね。
FILEポインタの中身なんて、いじった事無いです。
これprintf系で汎用的に使う為にこんな感じで実装してるのかなー?
そのまま使いたいところだけど、多分ライセンスで引っかかりそう・・・
マルチいくない!
つーか、なんで...
> Cでsnprintfを自作することになりました。
なんてことやってんの ?
win上でgccを使っているのですが、
*.libのファイルを*.oなんかに変換できますか?
別に *.lib のままでいいのでは?
何か不都合でもあるのん?
お答えありがとうございます。
ファイルフォーマットが認識されない、といわれたので。
単に対応していないだけなのでしょうね。
まあ、至急必要なものでもないですし。。。
あ、すまん。
*.a じゃなくて *.lib か。
なるほど。
分離ってできたっけかな...。
win 上の gcc とは何者で、その *.lib はどっから持ってきたものかを書けよ。
これからC言語を始めてみようという初心者です。
LSI CってのをDLしてみたんですが、使い方がよく分かりません。
参考書買ってみたんですが動かし方については詳しく載ってませんでした。
どなたか詳しく教えていただけませんか?
lsc ファイル名
以上
ごめん、うそ>46
lcc ファイル名
lcc.exeにちゃんとパスを通すこと
あと、_lccも自分の環境に合わせて編集すること
あとは、read.me読めば書いてるよ
えっと・・・
まだよくわからないんですが、
MS-DOSを開きますよね。
lcc filename
しますよね。
次は何をすれば動きますか?
エラーメッセージが出なければ、もう何もしなくていい。
やりかたは分かったんですが、
コマンドまたはファイル名が正しくありません
とでます。
どうすればいいですか?
しつこくてすいません。。。
MS-DOSのコマンドラインから
SET PATH=%PATH%***
と入力して
lcc filename
としてみてください。***の部分はパス名(C:\...\LCC\BIN;)です。
ちなみにBINはBINARY(二進)の略で実行可能ファイルが入ったフォルダの
名前として常識です。わかりましたか?
51ですが追伸です。参考になればいいのですが、_lccファイルです。
# LSI C-86 compiler's configuration file
-DLSI_C
-XC:\LSIC330C\BIN -LC:\LSIC330C\LIB -IC:\LSIC330C\INCLUDE -T -O
-acdos.obj $LSICOPTS
?Command line argument will be inserted here
-lknjlib -ldoslib -v
うぜぇ
Cそのものとは関係ねえ事書くな
∧ ∧___ ダッコ♪
/(*゚ー゚) /\
/| ̄∪∪ ̄|\/
| |/
 ̄ ̄ ̄ ̄
大人しくしていなさい。
セグメンテーション違反ですってなんですか?
変なとこに書き込んだりしたときに良く出る。
どこが間違ってるのかさっぱりわからんです...
変なとこをかいたりしたときに良く出る。
セグメンテーション違反は一番良く見るバグだと思うので、
頑張って間違った箇所を探しませう。
・配列の添え字が変な位置を指しているかどうか
・ポインタの扱いが間違っているかどうか
の2箇所を重点的に調べましょう。
それはコアダンプ。
ありがとうございます。
がんばって探してみます。
卒論間に合うか不安。。。
・・・デバッガ使えよ・・・
!?そ..それはいったい....?
emacsとかについてるやつですか?
gdbとか
emacs見てみたらgdbなるものを発見いたしました!
しかし英語表記のため使いかたがいまいちわからぬ。
調べてみます。。。
memsetでdouble型の配列の値を全てdouble x;
にすることはできますか?
できない。
デバッガという言葉も知らない奴が卒論までにgdbを使えるわけがない。
デバッガgdbの簡単な使い方。
まずプログラム作成 hoge.c
#include <stdio.h>
main(){
int *a = NULL;
*a = 0;
}
コンパイル時に -g オプションをつける
gcc -g -o hoge hoge.c
実行プログラムをgdbの引数に指定
gdb hoge
gdbのプロンプトが出たらrunを実行
(gdb) run
フォールトエラーなどが出たら、理由と場所を教えてくれる。
Program received signal SIGSEGV, Segmentation fault.
0x8048468 in main () at hoge.c:5
5 *a = 0;
終了するときはquit
(gdb) quit
初歩的な質問で申し訳ない。
ファイルからコンソール画面に一行一行読み込んで表示するという、
超基本的なプログラムを書いてみました。
そこで質問なのですが、今のままでは、改行は何も表示されない空白で表されますよね。
この改行部分に「----ここは改行です-----」といったメッセージを表示したいのですが、
どうすればいんでしょう?とりあえず自分が書いたものを↓に。
#include <stdio.h>
void main(){
FILE *fp;
char a[20];
fp = fopen("text.txt" ,"r");
do{
if (fgets(a ,20 ,fp) == NULL){
printf("//////終わりです//////\n" );
break;
}else{
if (a == ""){ ★★★問題の箇所です
printf("-----ここは改行です-----");
printf("%s\n" ,a);
}else
printf("%s\n" ,a);
}
}while(1);
fclose(fp);
return;
}
if(a=="") を if(*a=='\0') に変更すればいいのでは?
if (strlen(a))
a[strlen(a) - 1] = '\0';
ってのを付け加えた方がいいかも。
if (strcmp(a, "\n") == 0)
にすればええんでない?
まぁ簡単に
if (a[0] == '\n')
でもいいか。
あとは
・改行の場合はわざわざ a を表示しようとする必要は無い
・do-while じゃなくて、while 内で fgets を使ったので構わない。
・fp が NULL かどうかのチェックは入れる癖をつけておくが吉。
・最後の行にのみ改行が無い場合があることを考慮するべし。
ってとこでしょうか。
#include <stdio.h>
int main()
{
FILE *fp = fopen("text.txt", "r");
char a[20];
while (fgets(a, 20, fp) != NULL) {
if (a[0]=='\n')
printf("-----ここは改行です-----\n");
else
printf(a);
}
printf("//////終わりです//////\n" );
fclose(fp);
return 0;
}
printf(a); と printf("%s", a); は違う。
ごめんうっかりしてた。
printf(a)はprintf("%s", a)に読み替えて。
あなたのコードを見て思ったことを書きます。
だいたいさんが言ってくれてるけど。
・fgetsは改行も読み込むのでprintf("%s\n",a)でなくprintf("%s",a)。
・0回以上の繰り返しのときは基本的に, do-whileでなくwhileを使う。
・文字列の比較はstrcmpを使う。a==""としても文字列の比較ではなく
文字列のアドレスの比較が行われるだけで無意味。
あとのコードでも19文字ジャストの行を読み込むと誤動作します。
19文字ジャストの行を読むと, 次回のfgetsで改行文字だけを読み込む
ので, 文末の改行と空行との区別がつかなくなるためです。
a[]の配列を十分大きくとることで簡単に解決します。
> printf("%s", a)
漏れは fputs(a, stdout) のが好きだ。
72です!皆さんのご指摘でうまく動くようになりました。
質問の箇所だけではなく、他の様々な部分まで指摘してもらって、感謝してます。
判定文ごとwhileの中に入れろとか、さんの19文字ジャストでおかしくなる・・・とかの話は、
読みながらハタと手を打ってしまいました。
速度面で有利とか、エラーでにくいとか、そういったことが何かあるんですかね?
単に好みの問題でしょうか。
速度は大抵fputsのほうが速いだろう。
必ずじゃないけど。
教えてください!
return (
x1 >= x2+width2 || x1+width1 <= x2 ||
y1 >= y2+height2 || y1+height1 <= y2
) ? false : true;
ってどういうことですか??
if(x1 >= x2 + width2) return false;
if(x1 + width1 <= x2) return false;
if(y1 >= y2 + height2) return false;
if(y1 + height1 <= y2) return false;
return true;
と同じだよ。多分2つの領域の重なり判定と思う。
ふむふむ
確かゲーム系で、当たり判定のところっぽい関数だったからそうなのかも!
「||」って、「OR」だったと思うのですが、三項演算子って順々に判定してfalseやtureを返すんですか?
なんか質問部分がわかりにくいーー・・・
> 三項演算子って順々に判定してfalseやtureを返すんですか?
三項演算子 xxx ? yyy : zzz は、単に xxx の値の真/偽によって yyy か zzz を返すだけ。
順々に判定するのは、|| (論理 OR 演算子) の方。
xxx || yyy は、xxx が真なら yyy を実行しないで 真 を返す。
(短絡演算で、ググッてくれ。)
ありがとう!ググってきましたー。なるほど。よくわかりました
お世話になりました!
Cで書いたプログラムなんですが、コンパイルは通るのに実行するとエラーが起こります。
デバッグ(と呼んでいいのかどうか分かりませんが)したいのですが、
どのように行うのでしょうか。
コンパイラはgccをMS-DOS上(MinGW)で使っています。
そんなのソースださないと分かるわけ無いだろ。
せめてどうエラー出るのか書けや。
やはりソースによって変わってくるのですね。
一般的にどのようにやっていくのかお聞きしたくて、書き込みました。
エラーは、エラーログを作成しています。というメッセージと共に
プログラムが強制終了します。
> エラーは、エラーログを作成しています。というメッセージと共に
> プログラムが強制終了します。
.... で、そのエラーログとやらはあるのか ?
プログラムを少しづつ削っていって、エラーが出なくなったら直前に
削ったところが、エラーに関係するところだ。大抵は、
つーか、エラーログ出てるなら読めよとりあえず(w
gdb(gcc用のデバッガ)ないの?
なければprintfとassertと根性でバグ捜せ。
エラーログの読みかたわからないです。スマソ
実行したフォルダを探しても該当するようなファイルが見つかりません。
gdbというものは落としてすぐ使えるでしょうか?
探してみます。明日提出の課題なんです。
やはりそれですか・・・
皆さんどうもアリガd
おいおい、システムのエラーログに記録されとるんだろ。
実行フォルダには無いぞ。
見方教えてください。
お手数かけてほんとスマソ
だから、OSは何なんだよ(藁
何も情報書かずに推測するスレか、ここは。
恐らくLinux系だろうけど、君じゃ無理だ多分。その様子だと。
もアフォだけど、お前も相当だな。
> コンパイラはgccをMS-DOS上(MinGW)で使っています。
素の MS-DOS はエラーログなんか記録しないだろうから、どうせ Windows の MS-DOS プロンプトじゃねーのか ?
どうせ MAP ファイルなんか見れないんだから、素直に か の2行目に従えよ。
100desuyo
> printf("-----ここは改行です-----\n");
printf("-----ここは空行です-----\n");
厨質問で申し訳ないのですが
while(fgets(buf, 256, infp) !=NULL){
hoge = atoi(buf);
printf("hoge=%d\n",hoge);
}
とやりますと、全部のhogeが0となってしまいます。
読みこんだファイルは4行に渡る30バイトほどの
テキストファイルなのですが・・・
どなたかご教授オネガイイタシマス。
入力ファイルの内容を晒してみ?
printf("%s",buf);
でちゃんと、bufに文字列読み込まれてるか確認してみる。
103の言うとおり、どんな入力ファイルやねんやろ・・・
atoi関数の使い方もわかっていますか?
103,104サソ
アリガdございます。
テキストファイルを
345504
45454
3920
5503
こんな感じに直したらできますた。
文字が入ってたのがいけなかったのでしょうか?
atoiを使う際に"x"などの文字が混入していた際に
無視する方法ってあるのでしょうか?
ほんと厨ですみませそ。。。
あるプログラムを作成しました(長いので載せれません)。
そのプログラムはある配列変数の要素を小さく設定した時は
問題なく動いてくれるのですが、大きくするとsegmentation Failureがでます。
gdbをつかってデバッグしました。そしたら、
(gdb) core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libm.so.2...(no debugging symbols found)...done.
Reading symbols from /usr/lib/libc.so.4...(no debugging symbols found)...done.
Reading symbols from /usr/libexec/ld-elf.so.1...(no debugging symbols found)...
done.
#0 0x80489ab in main ()
(gdb) where
#0 0x80489ab in main ()
#1 0x8048506 in _start ()
となり、何行目に問題があるのか?という情報は教えてくれません。
どこがおかしいか、長年の経験のある皆様にお聴きしようと思ったしだいです。
助けて下さい。
(gdb) where
#0 0x80489ab in main ()
#1 0x8048506 in _start ()
が問題なんですよね?
これってどういう意味ですか?
どんなプログラムかも配列をどういうふうに使ってるのかも要素数をどの程度にしたのかもわからないのに答えろというのか・・・
atoi()はスペースと+-以外の文字とぶつかるとそこで終了しちゃいますよ
もしかしたら、文字を取り除く関数があるかもしれないけど
自分で取り除くコード書いたほうが柔軟性あっていいかもしれないですね
じゃーのせます。
連続投稿なるけどごめんなさい、どこが悪いか全く分りませんので
enumとmainだけとりあえず載せます
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
enum {
MAX_NODE = 87381, /* 自分で計算 (( pow(4,MAX_DEPTH) -1 ) / 3) */
MAX_RES = 81, /*ネットワーク内のリソースの種類*/
MAX_DEPTH = 9, /*木の深さ*/
MAX_SIM = 100, /*シミュレーション回数*/
REPEAT = 2 /*繰り返し数 シミュレーション数*/
};
main()
{
int i,j,k,query,query_number,num_reg,sum_query_number,sim_num,sum_num_reg,num_resource[MAX_RES],node[MAX_NODE][MAX_RES],rt[MAX_NODE][4][MAX_RES];
double adv_num_reg,adv_query_number;
FILE *outp;
srand((unsigned int)time(NULL));
sum_query_number = 0;
sum_num_reg = 0;
for( sim_num = 0 ; sim_num < REPEAT ; sim_num++ ){
/*ノードの登録を初期化*/
node_initialize(node);
/*ルーチングテーブル初期化*/
rt_initialize(rt);
/*リソース数を決定*/
for(i=0; i<MAX_RES; i++){
num_resource[i]=(int)(num_normalcurve() + 0.50);
/*printf("%d\n",num_resource[i]);*/
}
/*各ノードごとの各リソースの登録情報をセット*/
distribute(node,num_resource);
/*MATRIX表示*/
/*print_matrix(node);*/
for(k=0;k<MAX_SIM;k++){
/*QUERY決定*/
query = query_produce();
/*printf("query %d\n\n",query);*/
/*routing開始*/
route(query,node,rt);}
query = 3;
/*count the number of the query 3*/
query_number = count_qnum(query,rt);
/*rt表示*/
/*print_query(query,rt);*/
sum_query_number += query_number;
printf("query_number %d",query_number);
/*ノードAの登録数*/
num_reg = sum_reg_num(rt);
sum_num_reg += num_reg;
printf("registration_number %d",num_reg);
}
adv_query_number = (double)(sum_query_number) / (double)(REPEAT);
adv_num_reg = (double)(sum_num_reg) / (double)(REPEAT);
printf("adv_query_number %f",adv_query_number);
printf("adv_num_reg %f",adv_num_reg);
}
70〜140MBもスタックに取るつもりかよ
そこが問題ですか?enumんとこですよね?
age
何だよ、解決したんじゃなかったのか?
スタックに取りすぎだっつってんの
int i,j,k,query,query_number,num_reg,sum_query_number,sim_num,sum_num_reg,num_resource[MAX_RES],node[MAX_NODE][MAX_RES],rt[MAX_NODE][4][MAX_RES];
これがどれほど巨大なメモリを必要とするかわかる?
どうやったらいいのでしょうか?
main関数から変数をおいだせばいいのでしょうか?
配列をなくせばいいのでしょうか?
enumは関係ないのですか?
まず第一にバッファの使い方を見直すべし
んな巨大な配列が本当に必要なのか?
どうしても必要ならmallocなり何なりでヒープに取るべし
enumの値を配列サイズに使ってんだから関係あるに決まってる
分かりました。
配列を変更するのは難しそうですので、
別の変数を直して行きます。
mallocとか勉強します
ぷろぐらむの実行がいつまでたっても終らん。
実行を早くする基本は何?
プロファイラ使え。
さそ
ありがdございます
while(fgets(buf, 256, ifp) !=NULL){
for(i=0; i<strlen(buf); i++){
if(isalpha(buf[i])){
こんな感じでアルファベットだったらbufからその文字を省くといった
仕様にしたいのですが、bufからその文字だけ省くことなんて
可能なのでしょうか?
再度の糞厨質問ですいません。
ご教授オネガイイタシマス。
VC++買おうと思って製品情報見てるとVisual Studio .NETのページに行っちゃうんですが
Visual Studio .NET て何ですか?
VB,C#,VC++が全部入り
11万円もするよぉ!うわぁーぁぁん
ある4つほどの配列をファイルに書き込もうとして、
fwriteを使って書き込みました。
別のプログラムでそれを読み込もうとしてfreadで読み込んだのですが、
読み込んだ配列の中身が途中から0になってしまっています。
具体的には
a[130][100],b[100][30],c[100],d[30]を書き込んで
読み込んだaおよびbが途中から0になっていました。
けれどもcとdは正常に読み込めていました。
エラーチェックはしていますがエラーは出ていません。
プログラムも見直していますが、さっぱりわかりません。
どなたかご教授願いまつ。
ほんとに全部要るのか?
実際のものより小規模なモデルを作り、プログラムが正しく動作しているかを検証する。
各処理の実行時間を調べて、時間がかかっている部分を高速化する。
(但し、複雑になるような高速化は避ける。)
いくつかの規模のモデルを実行して、時間を測定し、実際のモデルでどれだけ時間が
かかるかを見積もる。
時間がかかり過ぎるようなら、別のアルゴリズムを探す。
別のアルゴリズムが見つからなければ、複雑な高速化に取り組む。
それでも時間がかかり過ぎるなら、プログラムを作ることの意義を見直す。
省いた後、隙間を詰める。
もしくは、省く文字以外を別バッファにコピーする。
#include <ctype.h>を追加して、
char tmp[256], *src, *dst ;
for ( src=buf, dst=tmp; *src; src++ ) {
if ( isdigit( *src ) || *src=='-' || *src=='+' )
*dst++ = *src ;
}
*dst= '\0' ;
hoge= atoi( tmp ) ;
但し、これだと "-1 2 +3" が "-12+3" になってしまうから
それいう可能性があるなら加工しる!
123で、"アルファベットだったらその文字を省く" って言ってるから、
if ( !isalpha( *src ) )
*dst++ = *src ;
のほうがいいかな。
先頭の空白は無視するというatoiの仕様を利用して、余計な文字をスペースに置き換えたら?
ファイルサイズが期待した通りになっているかを確認。
ファイルの中を見てみて、0が書かれているようなら、
fwrite、そうでなければ読み込みがfreadを見直す。
たぶん、二次元配列のサイズ計算が間違えているんだと思う。
途中からとかではなくて、実際にどこから0が書かれているかを
調べるのもいいと思う。(地道なことをちゃんとやらんと)
読み込むときも書き込むときもバイナリモードにした?
あ、UNIX系なら関係ないけど。
全部いらなくても、商利用したいときとか…
ところで、シェアウェアって、やっぱ商利用?
そりゃそうでつ。
細かい訂正ですが、b[100][32]でd[32]でした。
カエレ!(・∀・)とか言われそうですが、
ファイルサイズの計算はどうすればいいのでしょうか・・・
バイナリファイルの中身はどうやって見ればいいのでしょうか・・・バイナリエディタですか?
二次元配列のサイズ計算というのがよく分からないのですが・・・
今いろいろと検索していますがよく分かりません・・・
aはa[30][0]から0になっていて、bはb[7][6]から0になっています。
WindowsのCygwinってやつでやってます。
一応fopenにはwbやrbはちゃんと書いているので
大丈夫だと思います・・・
Visual C++ .NET Standard
買おうと思いますがどう思われますか?
VBは弄った事あります
スレ違い祭りか?
Visual C# .NET
Visual C++ .NETて何が違うんですか?
Cygwin なら
ls -l ファイル名
でファイルサイズが見れますよ。
バイナリファイルの中身は
dump ファイル名 | less
(less でなく more でもいいです。お好きなほうを)
で見れます。
C#とC++という時点で違う。
> ファイルサイズの計算はどうすればいいのでしょうか・・・
printf("%d", sizeof a);
もしくは
sizeof(aの型) * 130 * 100
として計算。あとはバイナリなんで、a, b, c, dを全部足せばよい。
> バイナリファイルの中身はどうやって見ればいいのでしょうか・・・バイナリエディタですか?
バイナリエディタもしくは16進ダンプするツールを探す。
なければ作れ。(簡単だから)
予想では0は書かれていないと思う。
> 二次元配列のサイズ計算というのがよく分からないのですが・・・
> (略)
> aはa[30][0]から0になっていて、bはb[7][6]から0になっています。
c, dは大丈夫で、a, bが駄目というんで、二次元配列の扱いが間違えているんだと思う。
fwrite()のところで3000や1350という数を渡してしまっている。
3000は130 * 100 を 30 * 100にしてしまっているとか…
いいんじゃない
ありがd。
とりあえずプログラムもう一度見直して
ファイルの中身見たりしてみまつ。
Visual C++ .NET Standard は
最適化が無くて、できた実行ファイルも配布禁止だったような。
完全に学習用なんで、それでもいいんなら買ったんでいいんでは?
autoって書くのって時代遅れっぽぃ?
>それって自動変数じゃねーだろ。
>(今時誰も書かないけど、auto ってキーワードもあるし...。)
そういわれたらそうかも(^^;
へんないいまわしだw
staticで宣言した瞬間にautoじゃなくなるもんね
>グローバル変数/関数のスコープには触れなくて良いのか ?
うーん、staticってなんでしか?って聞いてる人にあんまり難しいこといってもなぁ〜
って思いまして。
つまるところは内容が保持されるってことがいいたい。
そうすると、スコープの話になりますね・・・
>>(今時誰も書かないけど、auto ってキーワードもあるし...。)
う〜ん、C始めて、8年やけど、いまだかつてautoキーワード使ったこと無いわw
使うことってあるの?
EXEとか言っているあたりWindows上でコンパイルしたな・・・・
xreaはLinux(CPUはIntel系)だから。
printf("Content-type:text/html\n\n");
こんなん付けていましたが・・・ダメでした・・。
環境はVCなんです。・・うーぬ。
レスありがトン。
トクトクでコンパイルしたものをXREAにアップすれば動くかも
Windowsじゃだめなのですか!!
それは気付かなかった・・っていうか知らなかった〜
Linux対応にするにはどうすればいいか、わかります・・?
strtok(バッファの内容を改変してもいいとき)
もしくは strchr(よくないとき)を使う。
: の後は空白を空ける。
printf("Content-type: text/html\n\n");
Linux 上でコンパイルする。
他のバッファにコピーするならsscanf(src,"%[^#]",dest);こんな感じかな?
Linuxヵー自分全然わかんないッス・・・。
まだ遠い道なのかな・・。
レンタル鯖でCGIするなら、やっぱperlとかの方がいいっしょ。
実験用に自前鯖つくるか
*.cgi の中身ってどんな言語?
ってか、コンパイルされた状態なの?
テキストソースなの?
実行できるなら何でも。
のことならを読めば分かると思うけど・・・
> C言語で
> それをコンパイルして
そういう意味か・・・
標準入出力と環境変数にアクセスする機能があれば言語は問わない。
Cで書かれたものならもちろんコンパイルしないとだめ
確かにそういう意味かもしれんな...。
に補足するなら、サーバが許可してない形式のは実行できなかったと思う。
インタプリタ言語なら、もちろんインタプリタがサーバに置いてないと実行できない。
ホームでインタプリタを自前でコンパイルして使うという手もあるが...。
const struct ABC {int i;} a;
struct ABC b;
ってすると、なんで a しか定数にならないのー?
型限定子なのに
書き換え不能なstruct ABC型のaだからじゃない・・・
何がおかしいんだろ・・・
int findpos(char s[], int lim)
{
int i;
for (i = 0; s[i] != '\0' && i < lim; i++)
{
;
}
if (i == lim)
{
while (i >= 0 && (s[i] == ' ' || s[i] == '\t'))/*@*/
{
i--;
}
}
return i;
}
@の条件が常に偽になるのはなぜなのでしょう?
free()でsegmentation faultが発生するんですが考えられる原因は何でしょうか
・mallocで得た領域でない。
・既にfree済み。
const struct ABC {[?[struct]?] int i;} a;
「困った1」ではなくて「困った」でした。スマソ。
常に偽になるわけないでしょ。
findposに与える引数を工夫してみな。
それ以外にも、ポインタとかの使い方間違えてて、メモリ管理がぐちゃぐちゃになってるとか...。
>変数を後ろに宣言する何の必要があるのか?
関数でも変数でも定義や参照の後ろで宣言するのは意味無いし
,263
1)でした...
静的に確保した領域を開放しようとしてました.
どうもありがとうございました.
それで正常です。
構造体の定義の部分に const をつけても、
その構造体変数を作ろうとした場合に const になるわけではありません。
定義の部分でついでに定義した構造体変数が const になるのです。
常に const になって欲しいんならこんな感じで。
typedef const struct __ABC {int i;} ABC;
ABC a = { 0 };
ABC b = { 5 };
ありがとうございます。
その方向で工夫してみます。
再帰関数を書いたときにauto変数であることを明示するために書いたことがある。
>const struct ABC {int i;} a;
だと
const struct ABC a;
でって、ABCがconstになるわけじゃないですからね。
そもそも、型を定数にしてなんかいいことある?
あえてするなら
struct ABC {const int i;};
かな?
sizeof honyaraと、sizeof(honyara)って何か違いますか?
don't worry.
#define honyara honya + ra
後は自分で考えませう
バトルタワースレもこれで潰されてたな・・・
です。
んー、簡単なプログラムかいて、色々実験してみたんだけど、
結果は、同じになります。
あんまり悩む事じゃないのかな??
それは、そんな定義する奴の方が悪いと思うけど。
じゃ↓を試してみ
#define honyara 7 + 11
printf("%d\n",sizeof honyara );
printf("%d\n",sizeof(honyara));
型に対してsizeofするときは括弧が必要なんじゃなかった?
それは同意だが、は、何が違うのか聞いてるので…
だからと言ってそんな変な例を出してどうする。
sizeof 単一式
sizoof(型名)
と言うだけのことだろ。規格書ぐらい読めよ。
ごめん、コードはまた今度な。
俺が思うに、1 6\n2 7\n3 8・・・と表示してゆくのではなく、
1から5までを表示したあとに一番上の行間で戻って少し右にずらし6から10までを表示したいんだと思う。
× 行間で
○ 行まで
1 6
2 7
3 8
4 9
5 10
↑これを
#include <stdio.h>
int main(void){
int a,b;
for(a=1;a<6;a++){
for(b=a;b<=10;b+=5)
printf("%3d",b);
printf("\n");
}
}
こうじゃなくてああ
1 6
2 7
3 8
4 9
5 10
↑こういった出力結果が欲しいだけなんか?
だったら
int i;
for (i=1; i<=5; i++)
printf("%d %d\n", i, i+5);
これでええやん。
それだと1 -> 6 -> 2 -> 7という順で表示されるから嫌なんだと思う。
カーソルを移動させるための関数が必要だな。標準にはない。
俺も当初そう思ったんだけど,
を見る限り1 -> 6 -> 2 -> 7と表示させようとしてるような。
よう分からんけど、の環境で
同一プロセス内のスレッドが複数ある時の話じゃないか?
「Java 謎+落とし穴」のp50参照
C言語って関数内関数が使えないはずですよね?
gccだと通っちゃうんですが。何故?
gccが独自拡張してるからだYO!
-ansi -pedantic-errors
の、「ANSI準拠以外認めない」オプション付けたらエラーになる筈
ところで
、61
の掛け合いに激しくワラタんだが、
反応ないのをみるに、これって激しく既知のネタ?
Not Found.
知らなんだ。イイ! ね。
特に作業用の引数が必要な再帰関数使うときとか。
サンクス
というかなんで標準Cじゃ使えないんだよヽ(`Д´)ノ
スコープがちょっと違うだけだろうが!
> #define honyara (honya + ra)
> って宣言するだろ。
このくだらないつっこみのために遅レスしたの?
> #define honyara (honya + ra)
> って宣言するだろ。
#define honyara ((honya) + (ra))
>このくだらないつっこみのために遅レスしたの?
規格書を読んでいた為ではないかと。
あんたの意味なし煽り突っ込みよりマシかと。
趣味の差かと。
念には、念を入れると言う考え方もあるけど、俺はマクロ側で () 必須にするのが好み。
それもあるが、毎日 2ch 見てるわけじゃないし...。
>俺はマクロ側で () 必須にするのが好み。
#define a(b) (b * 5)
printf("%d\n", a((4 + 8)));
という意味だったら死刑。
早くこの荒らしアク禁に汁!
煽ったつもりはないですけど。
煽っているのはの方でしょ。
これ (=このくだらないつっこみのために遅レスしたの?) 書いといて...
> 煽ったつもりはないですけど。
と来たか...。
で煽りがないとは言わんけど、は見てんのかなぁ。
驚いたので感想を書いただけです。
亀レスでなければ驚きもしないですけど。
くだらないという表現がまずかったでしょうか。
> 驚いたので感想を書いただけです。
マジなのか、ネタ (だと思いたいが) なのかわからんけど。
まああんたみたいな奴も世の中にはいるということはわかった。
> 亀レスでなければ驚きもしないですけど。
自分で亀レスって書いといてなんだけど、2日と17時間ぐらいが、驚くほど亀レスか ?
君と違って、毎日 2ch 見てる香具師ばかりじゃないんだよ。
> くだらないという表現がまずかったでしょうか。
相手に対して、「くだらない」と言う表現がまずくない場合があるとでも思ってんの ?
1.構造体のメンバが宣言順にアドレス増加方向で並ぶのは保証されている
2.配列内の要素はアドレス増加方向で並ぶことが保証されている
3.アドレス演算は+で増加方向、-で減少方向が保証されている
だが、
4.構造体の中身が隙間無く並ぶことは保証されていない
に引っかかって誤動作することがあると思われ。
sizeof(int)=4,sizeof(short)=2として、
struct mix{
short a[1];
int b[1];
short c[1];
};
だと、恐らくmix.c[-3] != mix.a[0]になると思う。
ただそれよりも何よりも、そんな危険な匂いのするコード個人的に嫌だw
あんな書き込みでは2日と17時間でも驚くよ。
大抵は思っても書き込んだりはしないんじゃないかな。
要は2日と17時間経ってからレスしたことに驚いたんじゃなくて、あんなレスを2日と17時間も経ったあとにしたことに驚いたということ。
ハイハイ、わかりました。
二次元配列を引数にとるにはどうすればいいんですか?
int dat[100][100];
void func(int *param);
main(){
func(dat);
}
のようにやっても、うまくいきません。
void func(int** param);でもだめでした。
教えてください。
-3じゃなく-4かもね、それ。
void func(int param[][100])
void func(int (*param)[100])
void func(int param[][100]);
限定される。
ポインタの指すものの大きさが分からないとだめだろ。
そもそも配列の範囲外へのアクセスは保証されないよ。
しつこい、お前等ウザイからどっか逝け。
void func(int param[][100])
多次元配列の最上位の次元以外の範囲は省略できない。
よくわかりました。どうもありがとうございました。
int data[100 +2], *p;
p = data +2;
とすれば、p[-2], p[-1] が有効に使えるね。
あ、コメント閉じるの忘れてた。
param[n * 3 + 6] = 3; /* a[3][6] = 3; */
それだと2次元配列の見易さや配列の大きさについての
情報が無くなるから・・
void func(int *param,int n){
/*nは1列の要素数*/
*(param + 3 * n + 6) = 3;
}
と大差ないと思われ。
これなら通ることは恐らくも確認済みと思う。
関係ないが、関数の中にマジックナンバーを仕込むのは
サンプルコードでも止めて欲すぃ・・
==413
>sizoof(型名)
>規格書ぐらい読めよ。
規格書読む前に、アルファベットの綴りを覚えろよ
typo ぐらいでがたがた言うな。
数字だと瞬間での同一性の確認が得られるから、
こういうサンプルではマジックナンバーもアリかと思って。
あと、もし第二要素数の異なる二次元配列を扱うのであれば、
それと大差ないのは仕方がないんじゃないかな。
まぁ、
#define INDEX2(n2, a, b) ((a) * (n2) + (b))
とかして
param[INDEX2(n, 3, 6)] = 3;
とでもすればいいかと。
もちろん要素数固定ならこんなことする必要ないんだけどね。
が趣味の差かよ!!
age
ルパーン お前をタイポする〜〜
#include<stdio.h>
#include<stdlib.h>
int main (void){
int k,nsize;
int *pnVar;
printf("確保する大きさ");
scanf("%d",&nsize);
pnVar= (int *)malloc(sizeof(int)* nsize);
printf("%dバイトの領域を確保しました\n",4*nsize);
for(k=0;k<nsize;k++);
pnVar[k]=k*10;
for(k=0;k<nsize;k++);
printf("pnVar+%d=%p pnVar[%d]=%d\n",pnVar+k,k,pnVar[k]);
free(pnVar);
return 0;
}
何故かエラーがでます。
授業の板所を間違えて写してしまったのでしょうか
どなたか対処法をおねがいします。
マロック関数です
お前はその前に日本語を学びなおせ。
for文の後にいきなりセミコロンがあるが、それはどうなのよ?
↑お前ね、煽り方がふるくせんだよ。 ジジイかよ
Stack overflowと言うエラーは何ですか?
大学の研究でいきずまってるんですけど。助けてください。
まず仕事の数を入力して次に仕事の内容を入力して次に仕事別に分けたいのだけどどうしたらいいの?
ちなみに仕事は丸ブローチ加工、角ブローチ加工、キーみぞ加工の3種類です。
マロック関数ですか。
なんだか新鮮ですな。
バカ?
質問が漠然としてるな
いまいちわからない
研究にかかわってない人間でもわかるように質問して
少しおちついて考えればすぐ解ると思うが、
for(k=0;k<nsize;k++);/* k が nsize になるまで空回り*/
pnVar[k]=k*10;/* ここでは k は nsize と同じ値になっている*/
となっている。
451じゃないが、for文直後のセミコロンはいったい何なんだと小3分ほど(w
intの大きさをsizeof(int)と書いているところもあれば4と決めつけているところもあるね。
あ、エラーとはなんの関係もないよ。
include<stdio.h>
void main()
{
long sum=0;
short ten[10],i,n;
printf(“仕事数の入力(10個以内):”);
scanf(“%2d,&n);
for(i=0;i<n;++i){
printf(“%2d個目の仕事の入力:”,i+1);
scanf(“%s”,&ten[i]);
sum=sum+ten[i];
}
if(?){
printf(“丸ブローチ加工です。\n”);
}
}
ここで()のなかの条件式がわかりません。仕事の内容を入力する時にmと入力されれば
”丸ブローチ加工”です。と表示したいのです。初心者なのでよろしくおねがいします。
まずは全角のダブルクォーテーションをなんとかしろ。
次に、なんでshortに文字列を入れようとする?
sumって何に使うの?
アムロの(ry
木下君のやりたいことを想像してみよう
オリンピックで金メダルを取ること。
するとsparcかな。エンディアンしらねえや(w
でも書いたファイルがヌルだらけという状況からいって、
ビッグエンディアンっぽいね。
ともかくその場面ではfwriteを使うんじゃなくて、fputcを使うべし。
fputcは文字をストリームに書く関数というよりは、
一バイトストリームに書く関数って感じなので、バイナリ書けるよ。
サソ
アリガトウゴザイマス
確かに漏れバイナリわかってません。。。
32#more
44#baka
nanoka #utsuda
↑こんな感じのテキストファイル読み込んで
(#以降はコメントの扱いとして省く)
バイナリでファイルに書きこむっていう
プログラムを作っています。
putcでバイナリで書きこめるのであれば
私の仕様でもダイジョウブなんでしょうか?
最近夢にバイナリが出てきます。
鬱です。
32 とか 44 とかをバイナリで書き込むんですね?
でも、nanoka とかバイナリもテキストもないと思いますが
どういう仕様にしたいのでしょうか。
サソ
アリガdゴザイマス!
おっしゃる通りでして
"nanoka"はそのままカキコで
OKであります。
32やら44をバイナリで書きこみたい
のです。
ご教授お願い致します。
300get#300geto-
という場合はどうなんでしょう?
何にせよ、fgets で一行読み込んでから処理する方が楽な気がします。
サソ
fgetsのほうがよいですか。。。
while(fgets(buf, 256, ifp) !=NULL){
for(src=buf, dst=tmp; *src; src++){
if(*src == "#")
*dst++=*src;
}
*dst='\0';
こんな感じでいけますかねぇぇ。。。
atoi って知ってる?
aoiなら知ってる
ぬ★ぽなら知ってる
走査していって数字が見つかれば atoi、
見つからなければ1文字出力、
を続けていけばいいんじゃない?
フセジ カコワルイ
サソ
500ゲトの暁にそのコード書いて
くださひ。。。
もうアタマがオーヴァーヒートして
だめぽ。。。
ヒント挙げすぎちゃったかなと思ってるくらいなのに...。
ほらよ。行数多すぎとか言われたんで入るように手を加えた。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char * argv[]) {
char s[512], *p;
FILE *ifp, *ofp;
if (argc != 3) {
fputs("usage: hoge <in> <out>\n", stderr);
return 0;
}
ifp = fopen(argv[1], "rb"); ofp = fopen(argv[2], "wb");
if (!ifp || !ofp) {
perror(NULL);
return 3;
}
while (fgets(s, sizeof(s), ifp)) {
if (p = strchr(s, '#')) *p = '\0';
else if (p = strchr(s, '\n')) *p = '\0';
if (isdigit(*s)) {
int i = atoi(s);
fwrite(&i, sizeof(i), 1, ofp);
}
else
fputs(s, ofp);
fputc('\n', ofp);
}
fclose(ofp); fclose(ifp);
return 0;
}
32 行までな。
どなたか文字列指数をdouble型へ変換する最も効率の良い方法しりませんか?
"3e-5" を 0.00003とする場合など。
お願いします!!
double a;
sscanf("3e-5", "%g", &a)
ものすごくあっさりできるのですね。
ちなみに反対の変換はfcvt()でOKでしょうか?
sprintf()
了解しますた。
ありがとうございました。
サソ・・・
ふぉんとにありがdございます。
家に着いたらそこには宝があったよー!!
(゚д゚)ウマー(゚д゚)ウマー(゚д゚)ウマー
とりあえずケコーンしてくだはい。
あ、当方、29歳女、バツ2です。
・・・などとプロフィールを勝手に書いてみるテスト・・・
printfをラップしたいのだが、訳あってvprintfは使えないとき、
int myprintf(const char *format, ...){
return printf(?????);
}
こんなことは出来ないよねえ。
可変個引数をとる関数とva_listをとる関数はセットで用意しておくべき物なの?
質問の趣旨がわからないんだけど・・・。
29じゃ、すでに女じゃないな
淑女です
質問なのですが、
文字をそのままにして計算させることは可能でしょうか?たとえば、
double a=1.2, b=2.3, c, d;
d=a+b+c;
で、“d=3.5+c”と計算させたいのです。
誰か教えてください!出来れば、leap=で始まっている2ヶ所を関数にしたいんですが、どうしたらいいでしょう?
そうじゃなくてもこれをもっと短くする方法ってありますかね?
#include <stdio.h>
main()
{
static int days_data[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},Feb=28;
int i,days1,y1,m1,d1,days2,y2,m2,d2,leap,lapse,ydays;
printf("初めの年月日を入力してください : ");
scanf("%d %d %d",&y1,&m1,&d1);
printf("終りの年月日を入力してください : ");
scanf("%d %d %d",&y2,&m2,&d2);
leap=(y1%4==0 && y1%100!=0)|| y1%400==0;
days_data[2]=Feb+leap;
days1=d1;
for(i=1;i<m1;i++){
days1+=days_data[i];
}
leap=(y2%4==0 && y2%100!=0)|| y2%400==0;
days_data[2]=Feb+leap;
days2=d2;
for(i=1;i<m2;i++){
days2+=days_data[i];
}
ydays=0;
for(i=y1;i<y2;i++){
leap=(i%4==0 && i%100!=0)|| i%400==0;
ydays+=365+leap;
}
lapse=(ydays+days2)-days1;
printf("経過日数は%d日です\n",lapse);
}
一瞬ドキッとしたじゃねえかゴルァ(w
int isleap(int y1)
{
return (y1%4==0 && y1%100!=0)|| y1%400==0;
}
放置??他スレで聞くYO!
if(((y%4==0)&&(y%100!=0))||(y%400==0))d[2]=29;
c[1]=0;
for(i=1;i<11;++i){
c[i+1]=c[i]+d[i];
}
z=y-1601;
k=z/4 - z/100 + z/400 +1;
n=365*z+k+c[m];
r=n%7;
kara = 1-r;
while(kara<=d[m]){
made=kara+6;
if (made>d[m])
made=d[m];
for (i=kara; i<=made; ++i){
if (i<=0)
printf(" ");
else
printf(" %5d",i);
}
printf("n");
kara+=7;
}
printf("nn");
}
これを修正して欲しいのですが(全部表示されない月があります)
事故解決しました
× d[10]=31; d[11]=28; d[12]=31;
○ d[10]=31; d[11]=30; d[12]=31;
Cでは、いわゆるオーバーロードはできません。
これは可変長引数。printfみたいな。
あーなるほど。可変個の引数ですか。
確かにfcntl.hでは三番目は...となっていますね。
flagsによって三番目の引数があるかないか判断しているのかな。
ありがとうございました。
超超初心者です。
あるソフトのパッチを当てるのに
バイナリデータの変更で
0000E76A: 56 3b
と書いてあるのですがどういういみですか
本当に初心者ですね。
聞くべきスレッドを間違えるなんて。
スレ違いどころか板違いか。
追記
別のパッチでは
004167: 10 00
とADRESS部分が6文字なのですが?
エデッターでどう入れればいいのでしょうか
エデッターって何ですか?
int main(void) {
FILE *fp;
fp = fopen("hoge", "w+b");
fseek(fp, 0x4167, SEEK_SET);
fwrite("\x10\x00", 2, 1, fp);
fclose(fp);
return 0;
}
可変個の引数を取る関数の中で、与えられた引数の個数以上に読むのはまずいですけど、
少なく読むのはかまわないですよね?
yes
超怒素人です。
@のexeで取得した変数アドレスを
Aのexeから入力して変数の値を取得したいのですがうまくできません。
何故でしょうか?
@---------------------------------
#include<stdio.h>
int main(void)
{
int a;
long *pnt;
printf("数値を入力して下さい:");
scanf("%d",&a);
pnt = &a;
printf("変数のアドレス:%d\n",pnt);
printf("そのアドレスに格納されている値:%d\n",*pnt);
}
A---------------------------------
#include<stdio.h>
int main(void)
{
int a;
long *pnt;
printf("変数のアドレスを入力して下さい:");
scanf("%d",&a);
pnt = a;
printf("そのアドレスに格納されている値:%d\n",*pnt);
}
ポインタ変数の値が別プロセスで有効な保証は無い、というかまず無効
どうしよう...共有メモリとかの概念とか
物理アドレスと仮想アドレスとかの概念を教えた方がいいのだろうか...
そもそも何がしたいんだろう・・・
ありがとうございました。
39という文字が書かれたテキストがあって
この場合の"39"って2バイトですよね?
これを1バイトの39にパックしろって
指令されたんですが、
1.パックってなんですか?
2.パックを実現する方法(関数等)
上記2つに関してご教授下さると幸いです。
以上、初心者ですが宜しくお願いします。
って
printf("変数のアドレス:%p\n",pnt);
じゃダメなんすかね?
"39"という文字列を39という値にしろということだと思うけど・・・
atoi、strtol、sscanf
アドレスを手動で入力させるのってかなり無理がある。
1バイトならsscanfだと面倒か・・・intの変数に入れた後にcharの変数に入れ直さなければならないから。
fscanf(fp, "%2d", &inum);
は、いくらなんでも冗談として、
1の質問は指示した人間にするべきかと。
余りに一般的で汎用的な言葉だけに、
その相手がどんなつもりで「パック」と言ってるかわからん。
#尤も、「おまえそんなこともわからないのか」と言われる覚悟が必要だけど。
Packed BCDにしろって意味ではないかと。
一桁4bitで表現するので、0x39となる。
C言語の標準関数にはないです。
とはいえ、の言う通り一度確かめた方が確実。
パック十進数?
二桁なら12bit必要じゃない?
ありがとうございました。
成績処理プログラムの作り方を教えてください。できれば具体的に
プログラムを書いてくださるとありがたいです。
#include <stdlib.h>
int main(int argc, char **argv);
void getSeisekiData(void);
void calcHyouka(void);
void putKekka(void);
int
main(int argc, char **argv)
{
getSeisekiData();
calcHyouka();
putKekka();
return EXIT_SUCCESS;
}
/* それぞれの処理をこの後に書けば完成w */
サソ
ご回答ありがdです。
話しおわらさんといてや
int ENZAN (FILE *fp,char x,char y )
{
char z;
x&=0x0F;
x<<=4;
y&=0x0F;
z=x | y;
fwrite(&z, sizeof(z),1,fp );
}
↑こんな感じの処理をパックって
言うもんだと思ってました・・・
もっと詳しく説明してくれ。
昔にも、それBCDちゃうみたいなこといわれて、
調べ直したことがあったんだけど、
結局、どう解釈が違っているのかわからんかったんで。
>>565
ありがとうございます。
二桁で8bit、それに符号4bit、併せて12bit。
違うかな。
=562
1バイトにパックってことだから、符合は考慮しないんでないの?
#寡聞にして、符号付BCDの実例を知らないんだけど。
・・すみません、これどうやるのですか?
キーボードをでたらめ出鱈目に打つとき、英字(A-Z, a-z)
、数字(0-9)、その他の文字の出現頻度を数えなさい。
Ex.) I am a student. Hello %Enter → a = 2, d = 1, e = 2
初心者であんまりわからないのですが
/* 取り敢えず、こんなもんでどうでしょ。 */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char**argv);
int
main(int argc, char **argv)
{
int count[256];
int ch;
while (ch = getc() != EOF) {
count[ch]++;
}
/* 問題は出力方法 */
return EXIT_SUCCESS;
}
配列の0での初期化は?
GUIアプリケーションをLinuxで開発したいと思うんですが、
どんなライブラリを使えばいいんでしょうか?
どれがお勧めのライブラリなんでしょうか?
を読んでないだろ。
スマソ。別スレに逝きます・・・
あ、ぼけてた。
面倒だから
static int count[256];
で。
出力方法はこんなんでどうでしょ。
for (i = 0; i < 256; i++) {
if (isprint(i)) {
printf("%c: %d", i, count[i]);
}
}
師ね
改行しないと醜いかと。
スレ違い。
ごめん、ちょっと書いてみたくなっただけ。
今ユーザー関数作成で困っております。
仕様:テキストファイルを読み込み
行数毎に異なった処理を行い
バッファにぶちこむ。
for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++)
上記のようにすれば行数は数えることが
可能ですよね?
int cntに代入された数値を利用し
switch (cnt){
case 1:
printf("(゚д゚)ウマー\n");
break;
case 2:
printf("(・A・)イクナイ\n");
break;
といった感じにしたのですが
cntを関数に引数で渡すにはどのように
すればよろしいのでしょうか?
初心者でご迷惑お掛けいたしますが
ご教授お願いいたします。
関数の定義の仕方がわからんということか?
void uma(int cnt) {
switch (cnt){
case 1:
printf("(゚д゚)ウマー\n");
break;
case 2:
printf("(・A・)イクナイ\n");
break;
}
}
とか定義しといて
for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++) {
uma(cnt);
}
でいいんじゃないの。それともこういうことじゃない?
さん
ありがとーございます!
なるほど、こうやって定義するんですねぇ。
勉強になります。
cntが1だったら
(゚д゚)ウマーが出力されるのか。
すげー。関数すげー。
関数(゚д゚)ウマー
forを
for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++)
という形で使えるやつが、
な ん で 関 数 定 義 が わ か ら な い ん だ ? !
for は極めたが関数定義はまだ習っていないか理解が不十分。
で充分説明つくじゃないか。
氏ね
BASICからCに入ったので、(自分で定義する)関数というものを知らなかったに100ペリカ
したがって、mainはおまじないで、main以外の関数は一切なし。
しかもgotoを多用したスパゲッティプログラムだ!
Cから始めたけど、2000行程度なら関数はmainだけにするYO!
逝ってよし。
オマエモナー
そんな義理なし。
義理チョコしかもらえないんですか
義理チョコももらえませんが何か?
。・゚・(ノД`)・゚・。
氏ね屑
int main(){
//略
return 0;
}
この最後に返してる0ってなんに使うの?
子プロセスとしてプログラム動かしたら
wait(&state)とかでstateに入る数値になるの?
そこまで予想がついてるのなら、wait()のmanを見ればすぐ分かるよ。
statusの値そのものじゃなくて、#include <sys/wait.h> で定義されるマクロ
WEXITSTATUS(status) の値がmainの戻り値になる。
( ゜Д゜)ポカーン・・・
__
l⊆⊇`ヽ ≡ ヤホー----イ
(´ァョLノ ≡
m=○=mノ) ≡ もうスレ立ってた気がしる〜
_/_/(「_ノニコ ≡
( (0)=(__)0) ≡(´⌒(´⌒;;
嘘だろ?
800以降は確認したけど・・・
スレ立てたのなら現行スレに報告しろよ
それは立てた香具師に言ってくれ
sss
=6
おまえのチェックミスを棚に上げんな
禿同。はアフォ。早く削除依頼しなさい。
=10
自作自演でした。テヘッ
自作自演でした。
見ればわかります
void func(char **);
main()
{
char a[100][100];
func(a);
return 0;
}
void func(char **a)
{
}
↑のようにやったらプログラムが暴走したんですが
対処法はいかに?
void func(char a[][100])
PHP
PHPやったことないんですが・・ほんとに応用できるのですか?
int a = 4.3;
abs(3.5);
とかのミスってlintで検出できますか?
まあ、当然のことですけど
C++
C言語の感覚で書かれたC++はクソコード
誰もそんなことは聞いていない。
C++はオブジェクト指向なのになんでCが応用できるのかと小一時間(略
逆にCに応用できる言語は何ですか?
awk
C++
C++言語の感覚で書かれたCはクソコード
誰もそんなことは聞いていない。
結局、CとC++は、繰り返しや比較などが同じなだけであって
設計方法は全然違うわけだな。
ありがとう。でもそこに書いてあることをほとんど
やってくれなかった。
質問!!
C言語ってDVDなどにあるプロテクトもC言語に一種ですか?
教えてください
Cでsnprintfを自作することになりました。
参考になる資料とかありましたら教えてください。
フリーで使えるソースが何処かに落ちていると良いのですが。
VC++ならCRT\SRCフォルダに。
レスどうもです。
VC++見てみたのですが、うーん難しい事してるんですね。
FILEポインタの中身なんて、いじった事無いです。
これprintf系で汎用的に使う為にこんな感じで実装してるのかなー?
そのまま使いたいところだけど、多分ライセンスで引っかかりそう・・・
マルチいくない!
つーか、なんで...
> Cでsnprintfを自作することになりました。
なんてことやってんの ?
win上でgccを使っているのですが、
*.libのファイルを*.oなんかに変換できますか?
別に *.lib のままでいいのでは?
何か不都合でもあるのん?
お答えありがとうございます。
ファイルフォーマットが認識されない、といわれたので。
単に対応していないだけなのでしょうね。
まあ、至急必要なものでもないですし。。。
あ、すまん。
*.a じゃなくて *.lib か。
なるほど。
分離ってできたっけかな...。
win 上の gcc とは何者で、その *.lib はどっから持ってきたものかを書けよ。
これからC言語を始めてみようという初心者です。
LSI CってのをDLしてみたんですが、使い方がよく分かりません。
参考書買ってみたんですが動かし方については詳しく載ってませんでした。
どなたか詳しく教えていただけませんか?
lsc ファイル名
以上
ごめん、うそ>46
lcc ファイル名
lcc.exeにちゃんとパスを通すこと
あと、_lccも自分の環境に合わせて編集すること
あとは、read.me読めば書いてるよ
えっと・・・
まだよくわからないんですが、
MS-DOSを開きますよね。
lcc filename
しますよね。
次は何をすれば動きますか?
エラーメッセージが出なければ、もう何もしなくていい。
やりかたは分かったんですが、
コマンドまたはファイル名が正しくありません
とでます。
どうすればいいですか?
しつこくてすいません。。。
MS-DOSのコマンドラインから
SET PATH=%PATH%***
と入力して
lcc filename
としてみてください。***の部分はパス名(C:\...\LCC\BIN;)です。
ちなみにBINはBINARY(二進)の略で実行可能ファイルが入ったフォルダの
名前として常識です。わかりましたか?
51ですが追伸です。参考になればいいのですが、_lccファイルです。
# LSI C-86 compiler's configuration file
-DLSI_C
-XC:\LSIC330C\BIN -LC:\LSIC330C\LIB -IC:\LSIC330C\INCLUDE -T -O
-acdos.obj $LSICOPTS
?Command line argument will be inserted here
-lknjlib -ldoslib -v
うぜぇ
Cそのものとは関係ねえ事書くな
∧ ∧___ ダッコ♪
/(*゚ー゚) /\
/| ̄∪∪ ̄|\/
| |/
 ̄ ̄ ̄ ̄
大人しくしていなさい。
セグメンテーション違反ですってなんですか?
変なとこに書き込んだりしたときに良く出る。
どこが間違ってるのかさっぱりわからんです...
変なとこをかいたりしたときに良く出る。
セグメンテーション違反は一番良く見るバグだと思うので、
頑張って間違った箇所を探しませう。
・配列の添え字が変な位置を指しているかどうか
・ポインタの扱いが間違っているかどうか
の2箇所を重点的に調べましょう。
それはコアダンプ。
ありがとうございます。
がんばって探してみます。
卒論間に合うか不安。。。
・・・デバッガ使えよ・・・
!?そ..それはいったい....?
emacsとかについてるやつですか?
gdbとか
emacs見てみたらgdbなるものを発見いたしました!
しかし英語表記のため使いかたがいまいちわからぬ。
調べてみます。。。
memsetでdouble型の配列の値を全てdouble x;
にすることはできますか?
できない。
了解!!
デバッガという言葉も知らない奴が卒論までにgdbを使えるわけがない。
デバッガgdbの簡単な使い方。
まずプログラム作成 hoge.c
#include <stdio.h>
main(){
int *a = NULL;
*a = 0;
}
コンパイル時に -g オプションをつける
gcc -g -o hoge hoge.c
実行プログラムをgdbの引数に指定
gdb hoge
gdbのプロンプトが出たらrunを実行
(gdb) run
フォールトエラーなどが出たら、理由と場所を教えてくれる。
Program received signal SIGSEGV, Segmentation fault.
0x8048468 in main () at hoge.c:5
5 *a = 0;
終了するときはquit
(gdb) quit
初歩的な質問で申し訳ない。
ファイルからコンソール画面に一行一行読み込んで表示するという、
超基本的なプログラムを書いてみました。
そこで質問なのですが、今のままでは、改行は何も表示されない空白で表されますよね。
この改行部分に「----ここは改行です-----」といったメッセージを表示したいのですが、
どうすればいんでしょう?とりあえず自分が書いたものを↓に。
#include <stdio.h>
void main(){
FILE *fp;
char a[20];
fp = fopen("text.txt" ,"r");
do{
if (fgets(a ,20 ,fp) == NULL){
printf("//////終わりです//////\n" );
break;
}else{
if (a == ""){ ★★★問題の箇所です
printf("-----ここは改行です-----");
printf("%s\n" ,a);
}else
printf("%s\n" ,a);
}
}while(1);
fclose(fp);
return;
}
if(a=="") を if(*a=='\0') に変更すればいいのでは?
まず、fgets() って読み込んだ改行をそのまま a[] に入れちゃうから、
printf("%s\n", a) なんてやると、一行毎に空行が入るけどいいの ?
あと、要件として行が改行のみなら、"----ここは改行です-----" と表示すると言うのなら、でいいけど、「何も表示されない空白」の代わりに"----ここは改行です-----" と表示すると言うなら、ちょっと難しいぞ。
if (strlen(a))
a[strlen(a) - 1] = '\0';
ってのを付け加えた方がいいかも。
if (strcmp(a, "\n") == 0)
にすればええんでない?
まぁ簡単に
if (a[0] == '\n')
でもいいか。
あとは
・改行の場合はわざわざ a を表示しようとする必要は無い
・do-while じゃなくて、while 内で fgets を使ったので構わない。
・fp が NULL かどうかのチェックは入れる癖をつけておくが吉。
・最後の行にのみ改行が無い場合があることを考慮するべし。
ってとこでしょうか。
#include <stdio.h>
int main()
{
FILE *fp = fopen("text.txt", "r");
char a[20];
while (fgets(a, 20, fp) != NULL) {
if (a[0]=='\n')
printf("-----ここは改行です-----\n");
else
printf(a);
}
printf("//////終わりです//////\n" );
fclose(fp);
return 0;
}
printf(a); と printf("%s", a); は違う。
ごめんうっかりしてた。
printf(a)はprintf("%s", a)に読み替えて。
あなたのコードを見て思ったことを書きます。
だいたいさんが言ってくれてるけど。
・fgetsは改行も読み込むのでprintf("%s\n",a)でなくprintf("%s",a)。
・0回以上の繰り返しのときは基本的に, do-whileでなくwhileを使う。
・文字列の比較はstrcmpを使う。a==""としても文字列の比較ではなく
文字列のアドレスの比較が行われるだけで無意味。
あとのコードでも19文字ジャストの行を読み込むと誤動作します。
19文字ジャストの行を読むと, 次回のfgetsで改行文字だけを読み込む
ので, 文末の改行と空行との区別がつかなくなるためです。
a[]の配列を十分大きくとることで簡単に解決します。
> printf("%s", a)
漏れは fputs(a, stdout) のが好きだ。
72です!皆さんのご指摘でうまく動くようになりました。
質問の箇所だけではなく、他の様々な部分まで指摘してもらって、感謝してます。
判定文ごとwhileの中に入れろとか、さんの19文字ジャストでおかしくなる・・・とかの話は、
読みながらハタと手を打ってしまいました。
速度面で有利とか、エラーでにくいとか、そういったことが何かあるんですかね?
単に好みの問題でしょうか。
速度は大抵fputsのほうが速いだろう。
必ずじゃないけど。
教えてください!
return (
x1 >= x2+width2 || x1+width1 <= x2 ||
y1 >= y2+height2 || y1+height1 <= y2
) ? false : true;
ってどういうことですか??
if(x1 >= x2 + width2) return false;
if(x1 + width1 <= x2) return false;
if(y1 >= y2 + height2) return false;
if(y1 + height1 <= y2) return false;
return true;
と同じだよ。多分2つの領域の重なり判定と思う。
ふむふむ
確かゲーム系で、当たり判定のところっぽい関数だったからそうなのかも!
「||」って、「OR」だったと思うのですが、三項演算子って順々に判定してfalseやtureを返すんですか?
なんか質問部分がわかりにくいーー・・・
> 三項演算子って順々に判定してfalseやtureを返すんですか?
三項演算子 xxx ? yyy : zzz は、単に xxx の値の真/偽によって yyy か zzz を返すだけ。
順々に判定するのは、|| (論理 OR 演算子) の方。
xxx || yyy は、xxx が真なら yyy を実行しないで 真 を返す。
(短絡演算で、ググッてくれ。)
ありがとう!ググってきましたー。なるほど。よくわかりました
お世話になりました!
Cで書いたプログラムなんですが、コンパイルは通るのに実行するとエラーが起こります。
デバッグ(と呼んでいいのかどうか分かりませんが)したいのですが、
どのように行うのでしょうか。
コンパイラはgccをMS-DOS上(MinGW)で使っています。
そんなのソースださないと分かるわけ無いだろ。
せめてどうエラー出るのか書けや。
やはりソースによって変わってくるのですね。
一般的にどのようにやっていくのかお聞きしたくて、書き込みました。
エラーは、エラーログを作成しています。というメッセージと共に
プログラムが強制終了します。
> エラーは、エラーログを作成しています。というメッセージと共に
> プログラムが強制終了します。
.... で、そのエラーログとやらはあるのか ?
つーか、エラーログ出てるなら読めよとりあえず(w
gdb(gcc用のデバッガ)ないの?
なければprintfとassertと根性でバグ捜せ。
エラーログの読みかたわからないです。スマソ
実行したフォルダを探しても該当するようなファイルが見つかりません。
gdbというものは落としてすぐ使えるでしょうか?
探してみます。明日提出の課題なんです。
やはりそれですか・・・
皆さんどうもアリガd
おいおい、システムのエラーログに記録されとるんだろ。
実行フォルダには無いぞ。
見方教えてください。
お手数かけてほんとスマソ
∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´∀`)/< 先生! なぜそんなに粘着しするんですか?。
_ / / / \________________
\⊂ノ ̄ ̄ ̄ ̄\
||\ \
||\|| ̄ ̄ ̄ ̄ ̄||
|| || ̄ ̄ ̄ ̄ ̄||
.|| ||
だから、OSは何なんだよ(藁
何も情報書かずに推測するスレか、ここは。
恐らくLinux系だろうけど、君じゃ無理だ多分。その様子だと。
もアフォだけど、お前も相当だな。
> コンパイラはgccをMS-DOS上(MinGW)で使っています。
素の MS-DOS はエラーログなんか記録しないだろうから、どうせ Windows の MS-DOS プロンプトじゃねーのか ?
どうせ MAP ファイルなんか見れないんだから、素直に か の2行目に従えよ。
100desuyo
> printf("-----ここは改行です-----\n");
printf("-----ここは空行です-----\n");
厨質問で申し訳ないのですが
while(fgets(buf, 256, infp) !=NULL){
hoge = atoi(buf);
printf("hoge=%d\n",hoge);
}
とやりますと、全部のhogeが0となってしまいます。
読みこんだファイルは4行に渡る30バイトほどの
テキストファイルなのですが・・・
どなたかご教授オネガイイタシマス。
入力ファイルの内容を晒してみ?
printf("%s",buf);
でちゃんと、bufに文字列読み込まれてるか確認してみる。
103の言うとおり、どんな入力ファイルやねんやろ・・・
atoi関数の使い方もわかっていますか?
103,104サソ
アリガdございます。
テキストファイルを
345504
45454
3920
5503
こんな感じに直したらできますた。
文字が入ってたのがいけなかったのでしょうか?
atoiを使う際に"x"などの文字が混入していた際に
無視する方法ってあるのでしょうか?
ほんと厨ですみませそ。。。
あるプログラムを作成しました(長いので載せれません)。
そのプログラムはある配列変数の要素を小さく設定した時は
問題なく動いてくれるのですが、大きくするとsegmentation Failureがでます。
gdbをつかってデバッグしました。そしたら、
(gdb) core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libm.so.2...(no debugging symbols found)...done.
Reading symbols from /usr/lib/libc.so.4...(no debugging symbols found)...done.
Reading symbols from /usr/libexec/ld-elf.so.1...(no debugging symbols found)...
done.
#0 0x80489ab in main ()
(gdb) where
#0 0x80489ab in main ()
#1 0x8048506 in _start ()
となり、何行目に問題があるのか?という情報は教えてくれません。
どこがおかしいか、長年の経験のある皆様にお聴きしようと思ったしだいです。
助けて下さい。
(gdb) where
#0 0x80489ab in main ()
#1 0x8048506 in _start ()
が問題なんですよね?
これってどういう意味ですか?
どんなプログラムかも配列をどういうふうに使ってるのかも要素数をどの程度にしたのかもわからないのに答えろというのか・・・
atoi()はスペースと+-以外の文字とぶつかるとそこで終了しちゃいますよ
もしかしたら、文字を取り除く関数があるかもしれないけど
自分で取り除くコード書いたほうが柔軟性あっていいかもしれないですね
じゃーのせます。
連続投稿なるけどごめんなさい、どこが悪いか全く分りませんので
enumとmainだけとりあえず載せます
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
enum {
MAX_NODE = 87381, /* 自分で計算 (( pow(4,MAX_DEPTH) -1 ) / 3) */
MAX_RES = 81, /*ネットワーク内のリソースの種類*/
MAX_DEPTH = 9, /*木の深さ*/
MAX_SIM = 100, /*シミュレーション回数*/
REPEAT = 2 /*繰り返し数 シミュレーション数*/
};
main()
{
int i,j,k,query,query_number,num_reg,sum_query_number,sim_num,sum_num_reg,num_resource[MAX_RES],node[MAX_NODE][MAX_RES],rt[MAX_NODE][4][MAX_RES];
double adv_num_reg,adv_query_number;
FILE *outp;
srand((unsigned int)time(NULL));
sum_query_number = 0;
sum_num_reg = 0;
for( sim_num = 0 ; sim_num < REPEAT ; sim_num++ ){
/*ノードの登録を初期化*/
node_initialize(node);
/*ルーチングテーブル初期化*/
rt_initialize(rt);
/*リソース数を決定*/
for(i=0; i<MAX_RES; i++){
num_resource[i]=(int)(num_normalcurve() + 0.50);
/*printf("%d\n",num_resource[i]);*/
}
/*各ノードごとの各リソースの登録情報をセット*/
distribute(node,num_resource);
/*MATRIX表示*/
/*print_matrix(node);*/
for(k=0;k<MAX_SIM;k++){
/*QUERY決定*/
query = query_produce();
/*printf("query %d\n\n",query);*/
/*routing開始*/
route(query,node,rt);}
query = 3;
/*count the number of the query 3*/
query_number = count_qnum(query,rt);
/*rt表示*/
/*print_query(query,rt);*/
sum_query_number += query_number;
printf("query_number %d",query_number);
/*ノードAの登録数*/
num_reg = sum_reg_num(rt);
sum_num_reg += num_reg;
printf("registration_number %d",num_reg);
}
adv_query_number = (double)(sum_query_number) / (double)(REPEAT);
adv_num_reg = (double)(sum_num_reg) / (double)(REPEAT);
printf("adv_query_number %f",adv_query_number);
printf("adv_num_reg %f",adv_num_reg);
}
70〜140MBもスタックに取るつもりかよ
そこが問題ですか?enumんとこですよね?
age
何だよ、解決したんじゃなかったのか?
スタックに取りすぎだっつってんの
int i,j,k,query,query_number,num_reg,sum_query_number,sim_num,sum_num_reg,num_resource[MAX_RES],node[MAX_NODE][MAX_RES],rt[MAX_NODE][4][MAX_RES];
これがどれほど巨大なメモリを必要とするかわかる?
どうやったらいいのでしょうか?
main関数から変数をおいだせばいいのでしょうか?
配列をなくせばいいのでしょうか?
enumは関係ないのですか?
まず第一にバッファの使い方を見直すべし
んな巨大な配列が本当に必要なのか?
どうしても必要ならmallocなり何なりでヒープに取るべし
enumの値を配列サイズに使ってんだから関係あるに決まってる
分かりました。
配列を変更するのは難しそうですので、
別の変数を直して行きます。
mallocとか勉強します
ぷろぐらむの実行がいつまでたっても終らん。
実行を早くする基本は何?
プロファイラ使え。
さそ
ありがdございます
while(fgets(buf, 256, ifp) !=NULL){
for(i=0; i<strlen(buf); i++){
if(isalpha(buf[i])){
こんな感じでアルファベットだったらbufからその文字を省くといった
仕様にしたいのですが、bufからその文字だけ省くことなんて
可能なのでしょうか?
再度の糞厨質問ですいません。
ご教授オネガイイタシマス。
VC++買おうと思って製品情報見てるとVisual Studio .NETのページに行っちゃうんですが
Visual Studio .NET て何ですか?
VB,C#,VC++が全部入り
11万円もするよぉ!うわぁーぁぁん
ある4つほどの配列をファイルに書き込もうとして、
fwriteを使って書き込みました。
別のプログラムでそれを読み込もうとしてfreadで読み込んだのですが、
読み込んだ配列の中身が途中から0になってしまっています。
具体的には
a[130][100],b[100][30],c[100],d[30]を書き込んで
読み込んだaおよびbが途中から0になっていました。
けれどもcとdは正常に読み込めていました。
エラーチェックはしていますがエラーは出ていません。
プログラムも見直していますが、さっぱりわかりません。
どなたかご教授願いまつ。
ほんとに全部要るのか?
実際のものより小規模なモデルを作り、プログラムが正しく動作しているかを検証する。
各処理の実行時間を調べて、時間がかかっている部分を高速化する。
(但し、複雑になるような高速化は避ける。)
いくつかの規模のモデルを実行して、時間を測定し、実際のモデルでどれだけ時間が
かかるかを見積もる。
時間がかかり過ぎるようなら、別のアルゴリズムを探す。
別のアルゴリズムが見つからなければ、複雑な高速化に取り組む。
それでも時間がかかり過ぎるなら、プログラムを作ることの意義を見直す。
省いた後、隙間を詰める。
もしくは、省く文字以外を別バッファにコピーする。
#include <ctype.h>を追加して、
char tmp[256], *src, *dst ;
for ( src=buf, dst=tmp; *src; src++ ) {
if ( isdigit( *src ) || *src=='-' || *src=='+' )
*dst++ = *src ;
}
*dst= '\0' ;
hoge= atoi( tmp ) ;
但し、これだと "-1 2 +3" が "-12+3" になってしまうから
それいう可能性があるなら加工しる!
123で、"アルファベットだったらその文字を省く" って言ってるから、
if ( !isalpha( *src ) )
*dst++ = *src ;
のほうがいいかな。
先頭の空白は無視するというatoiの仕様を利用して、余計な文字をスペースに置き換えたら?
「アルファベットだったら」じゃなくて「数字か+,-でなかったら」の方がいいと思うけど。
ファイルサイズが期待した通りになっているかを確認。
ファイルの中を見てみて、0が書かれているようなら、
fwrite、そうでなければ読み込みがfreadを見直す。
たぶん、二次元配列のサイズ計算が間違えているんだと思う。
途中からとかではなくて、実際にどこから0が書かれているかを
調べるのもいいと思う。(地道なことをちゃんとやらんと)
読み込むときも書き込むときもバイナリモードにした?
あ、UNIX系なら関係ないけど。
全部いらなくても、商利用したいときとか…
ところで、シェアウェアって、やっぱ商利用?
そりゃそうでつ。
細かい訂正ですが、b[100][32]でd[32]でした。
カエレ!(・∀・)とか言われそうですが、
ファイルサイズの計算はどうすればいいのでしょうか・・・
バイナリファイルの中身はどうやって見ればいいのでしょうか・・・バイナリエディタですか?
二次元配列のサイズ計算というのがよく分からないのですが・・・
今いろいろと検索していますがよく分かりません・・・
aはa[30][0]から0になっていて、bはb[7][6]から0になっています。
WindowsのCygwinってやつでやってます。
一応fopenにはwbやrbはちゃんと書いているので
大丈夫だと思います・・・
Visual C++ .NET Standard
買おうと思いますがどう思われますか?
VBは弄った事あります
スレ違い祭りか?
Visual C# .NET
Visual C++ .NETて何が違うんですか?
Cygwin なら
ls -l ファイル名
でファイルサイズが見れますよ。
バイナリファイルの中身は
dump ファイル名 | less
(less でなく more でもいいです。お好きなほうを)
で見れます。
C#とC++という時点で違う。
> ファイルサイズの計算はどうすればいいのでしょうか・・・
printf("%d", sizeof a);
もしくは
sizeof(aの型) * 130 * 100
として計算。あとはバイナリなんで、a, b, c, dを全部足せばよい。
> バイナリファイルの中身はどうやって見ればいいのでしょうか・・・バイナリエディタですか?
バイナリエディタもしくは16進ダンプするツールを探す。
なければ作れ。(簡単だから)
予想では0は書かれていないと思う。
> 二次元配列のサイズ計算というのがよく分からないのですが・・・
> (略)
> aはa[30][0]から0になっていて、bはb[7][6]から0になっています。
c, dは大丈夫で、a, bが駄目というんで、二次元配列の扱いが間違えているんだと思う。
fwrite()のところで3000や1350という数を渡してしまっている。
3000は130 * 100 を 30 * 100にしてしまっているとか…
いいんじゃない
ありがd。
とりあえずプログラムもう一度見直して
ファイルの中身見たりしてみまつ。
Visual C++ .NET Standard は
最適化が無くて、できた実行ファイルも配布禁止だったような。
完全に学習用なんで、それでもいいんなら買ったんでいいんでは?
自明というわけでは無い気がしますけども…
フリーなら配布可でつ。
デキタ━(゚∀゚)━!!!!
,両氏指摘のように、
原因はfwriteおよびfreadの書き込み、読み込み数指定が間違っていたようです。
プログラムでは
fwrite(a,sizeof(double),input*middle,fp)
といったように書いていたのです。
inputとmiddleはdefineであらかじめ定義してありました。
特にinputは
#define input aho+bakaといった形で・・・
今まで本当に知らなかったのが恥ずかしいくらいなのですが、
この状態でinput*middleってやるとaho+baka*middleってことになるんですね・・・
てっきりahoとbakaの和がinputに入るんだとばかり思ってました・・・
#define input (aho+baka)で解決しますた。(´・ω・`)
書き込みから間違ってることが判明したので、
25時間かけたデータを取り直しまつ・・・(´・ω・`)
氏の言うとおり、出力ファイルのサイズはsizeof(double)が8だったので
8*(130*100+100*32+100+32)=130656Byte が正しかったのですが、
質問時の出力ファイルは28kByteくらいでした・・・
今考えると8*(31*100+7*32+6+100+32)=27696Byte だったのですね・・・
みなさまありがとうございますた。ご迷惑おかけしますた。逝ってきまつ。
お疲れ様
(´-`).。oO 150は経験値が1上がった
ありがとうございます。
Visual C++ と Visual C++ .NET の違いは何でしょうか?
マジで!?
箱には・・・
「学習用を目的とした製品となります。
商用製品など、本格的なアプリケーションの開発は、
Visual Studio .NET Professional 以上の製品をお勧めいたします。」
・・・と、あるけど・・・?
あくまで、お勧めであって・・・
ダメとはどこにも書いてないっぽい。
今から、もうちょっとマニュアル読んでみる。
staticってなんれすか?
静電気
自動変数をstatic領域に配置することだよ
static int a;
とかって宣言すると、その関数終了しても内容の保持が保証されるのです
( ゚д゚)
つーことは
static int foo(void);
と言う関数は、static領域に配置されるから内容の保持が保証されるけど
int foo(void);
と言う関数は、内容の保持が保証されないのですね?
void analysis(int ch)
{
static int repeat_count = -1; /* < 0 は無効値 */
int i;
if (ch == 'F' || ch == 'R' || ch == 'L') {
if (repeat_count < 0) repeat_count = 1;
for (i = 0; i < repeat_count; i++) {
switch(ch){
case 'F': forward(); break;
case 'R': right_turn(); break;
case 'L': left_turn(); break;
}
}
repeat_count = -1;
} else if (isdigit(ch)) {
if (repeat_count < 0) repeat_count = ch - '0';
else repeat_count = repeat_count * 10 + ch - '0';
}
}
丁寧に説明してくらさい。
関数は変数なんですね?
ってことで、ザッと見てみたが・・・
どこにも、作ったバイナリの配布を禁止してる下りもないし、
また、商用アプリを作ってはダメって下りもない。
あくまで推奨。お勧め。
作ったバイナリ配布しても、
シェアソフト作ってもOKっぽいぞ。
( ゚д゚)< ポカーン
サンクス!
たとえば"15FR160L"という文字列があったとき,
それを先頭から一文字づつanalysisに渡すと,
forwoard()が15回, right_turn()が1回,
left_turnが160回, の順で実行される。
staticの解釈はこの場合で合ってるから, あとは自分で追ってみれ。
static の関数は同じファイルの中からしか
直接呼び出すことが出来ないんじゃなかったっけ?
の
>/* < 0 は無効値 */
ってコメントは的外れと思うのは気のせい?
if (repeat_count < 0) repeat_count = 1; ここか?
サンクス!!
else if (isdigit(ch)) {
if (repeat_count < 0) repeat_count = ch - '0';
else repeat_count = repeat_count * 10 + ch - '0';
コメント風に解説おながいします。
ん?なんで?
数字が何桁続くかわからないから、下から4行目の
if ( repeat_count < 0 )
の行で1桁目なのか2桁目以降なのかを判定するためでしょ?
カキコする前にreloadしてみたら の答えにもなってた。
>isdigit(ch)
chのアスキーコード値が数字の文字かどうかの判別
>ch - '0'
文字0のコード値で引く
あたりまえじゃん
?
サンクス!!!
横突っ込みでスマソが
そんなコメントは書くなよ
スマソ、完全にボケてました
コピペしたから気づかんかったけど
/* 0 は無効値 */
ではなく
/* < 0 は無効値 */
だったんですね…首吊ってきます
まだ生きてる?
なるほど。
確かに -1 ってハードコーディングしてるんだから
/* -1 は無効値 */
のほうが読みやすいかも知れませんね。
見間違えは誰でもあるYO まあまあ気を落とすなw
これってこの前オレが書いたやつじゃん。
ちなみにあのコメントはrepeat_countが負の値をとらないよって意味。
だから-1かどうかではなく、負かどうかの判定になっている。
つか、NULL を無効値にすればいんじゃ・・・?
数字検出時に何桁目なのかを意識しなくても
if ( isdigit(ch) )
repeat_count = repeat_count * 10 + ch - '0' ;
で済むし。
但し、入力が "0R"とかの場合にとは挙動が変わってしまうが。
まぁ、他人の課題にそこまで考えてやる必要ないし。気ぃ悪くしたらスマソ。
>但し、入力が "0R"とかの場合にとは挙動が変わってしまうが。
まさにこれが負値を無効値にしてる理由じゃないの?
どこから突っ込んで欲しいの?
理由は、さんの言っている通りです。
-の入力は流石にないだろうけど、0はあるだろうと思って。
質問には書いてなかったんで、どちらでもいいと思いますが。
あと、同じ人?って書いたのもオレです。
まぁ前処理で0はカットできるけどね。
ちゃんとassertなりで0を受け付けないと表明するなら
もアリかも。あと0->NULLだけど逆は必ずしも真ならず。
何でNULLは突っ込んで
挙動が変わるのは"R"等であって
"0R"等ではない事に突っ込まないかな…
gccのライブラリファイルのリンクトラブルは
どうやって解決するのがいいんでしょうか?
よく,-L,-lのオプションが足りないと,
undefined reference to `xxxxx'
と文句いわれるけど,
そのファイルがどのライブラリにあるとか,
どうやって調べたらいいんでしょう?
nm
grep
0を無効値にするってことは, ふつう無効値チェック部分の,
if (repeat_count < 0) repeat_count = 1;
を,
if (repeat_count == 0) repeat_count = 1;
と書き換えることを含意するんじゃないの?
130-133サソ
アリガトウゴザイマシタ
while(fgets(buf, 256, ifp) !=NULL){
for(src=buf, dst=tmp; *src; src++){
if(! isalpha(*src))
*dst++=*src;
}
*dst='\0';
hoge = atoi(tmp);
printf("hoge = %d",hoge);
fprintf(ofp, "%d\n", hoge);
}
ご教授頂いたように修正したところ
無事仕様とおりに動きました。
fopen() で "wb" モードで開け。
char 型の変数に 32 を代入して fwrite() で書け。
終わったら fclose() で閉じろ。
とりあえず あたりを読んでください。
そうだったんだ...。
VC5の頃はダメって書いてあったと思うので、
特にいいって書いてないだけでも
ダメなんだと思い込んでしまったのかも。
age
> 自動変数をstatic領域に配置することだよ
それって自動変数じゃねーだろ。
(今時誰も書かないけど、auto ってキーワードもあるし...。)
> static int a;
> とかって宣言すると、その関数終了しても内容の保持が保証されるのです
グローバル変数/関数のスコープには触れなくて良いのか ?
auto って書いてた時期ってそもそもあるの?
K&R の時代のことはよー知らんのだが。
1.関数の外に書いた変数や関数につけた場合
その変数や関数の名前がそのファイル内でしか通用しなくなる。
2.関数の中の変数につけた場合
その名前が関数の中でしか通用しないことを除いて
グローバル変数と同様の扱いになる。
(つまり、初期化は実行前に決まる値でしか行えず、
初期化を省略すれば 0 で初期化される。
staticとグローバルはメモリまわりでちょっと違うんじゃなかったか?忘れたが
> auto って書いてた時期ってそもそもあるの?
> K&R の時代のことはよー知らんのだが。
最近の香具師は、規格も知らんのか ?
(まあ、普通は省略できるから気にしなくてもいいんだが。)
の 2. の意味では、まず同じ。(よほどひねくれた実装は除くが...。)
逆に、同じ静的変数でも初期化指定子がない (or 0 で初期化) 場合と、0 以外で初期化する場合で異なるメモリセクションに配置する処理系は多い。
そもそも、日本語で自動変数って
autoを直訳しただけだからね…
auto ってのがあることくらい知ってるけどさ、
でも、使ったことないんで。
いや、とりあえず使ってみたことはあるが。
register もそうだなー。
VCとか無視するって書いてるし。
autoって書くのって時代遅れっぽぃ?
>それって自動変数じゃねーだろ。
>(今時誰も書かないけど、auto ってキーワードもあるし...。)
そういわれたらそうかも(^^;
へんないいまわしだw
staticで宣言した瞬間にautoじゃなくなるもんね
>グローバル変数/関数のスコープには触れなくて良いのか ?
うーん、staticってなんでしか?って聞いてる人にあんまり難しいこといってもなぁ〜
って思いまして。
つまるところは内容が保持されるってことがいいたい。
そうすると、スコープの話になりますね・・・
>>(今時誰も書かないけど、auto ってキーワードもあるし...。)
う〜ん、C始めて、8年やけど、いまだかつてautoキーワード使ったこと無いわw
使うことってあるの?
registerは要るよ! ほんとに速くなるか良く知らないけど
volatileは要るよ!
ん〜大概のコンパイラは最適化の段階で勝手にregisterつかってくれるんじゃないの?
registerは最適化のヒントにしかならない。本当にレジスタ使って
くれるかどうかはわからない。
x86のようなレジスタが少ないCPUならなおさらその傾向が強い。
ソースを見やすくする為に使う
取り敢えず、最優先したい変数はregisterを使い
レジスタに割り当てて欲しくない変数はvolatileを使い(←正しい使い方と違うけど)
レジスタが余ってる場合にはレジスタに割り当てて欲しい場合はautoを使えば
ソースを見た時に、明示的に優先するべき変数が分かるようになる
ちなみに、省略された変数は、一時的なもので最終的には使わない予定の変数
そんなにごちゃごちゃ書いてたら
鬱陶しいことこの上ない(w
見やすくするためにautoやvolatileなどの機能を伴う(とされている)
修飾子を使うのは誤り。するべきは変数名の工夫、コードの構成。
autoは使わない w
registerは優秀なコンパイラを使っていれば必要ないんじゃない?
volatileは・・・・それを必要とするほど高度なプログラムを俺は書いたことがないw
俺は上の三つは使ったことないな。signedも使ったことないかも
みんなは外部のファイルから参照される関数の頭にexternをつける?
俺はデフォルトでexternになっているからつけないんだけど。
プロトタイプにはつける人もいるみたいだから。
漏れはつけない。無駄だと思ふ。
無意味といえば単項演算子の+もauto同様、無意味だよな。
extern int i; /* 宣言 */
void foo()
{
:
i++; /* 参照 */
:
}
int i ; /* 定義 */
これをstaticでやりたい場合はどうするの?
ファイル内でしか通用しないのだから
普段は宣言無しで定義を一番上に書く事にしてるんだけど
出来たら、それは、それで少し便利かなと…
int* p;
p=malloc(sizof(int), 100);
で動的に確保したpの配列要素数を調べるにはどうすればいいでしょう?
sizeof(p)ならsizeof(int *)がもとまってしまいます...
もちろんサイズ100ってわかってるのになんで?ってのは
なしでおねがいします.
出来ない。いじょ。
その100を覚えておけばいいだろ
そうですか...
そういわれると基も子もありません...
今からよんできます.
一応
static int i; /* 定義 */
にすればできる。
でも、そういうのはできるだけ一箇所で済ませたいと思うけどね。
2箇所で整合性とらなあかんのは面倒。
関数の場合は前方参照問題とかあるから
static でもプロトタイプ宣言するのは有意義だけど、
変数では滅多にそういう問題ないから不必要っしょ。
要するに、何か変数に保存しときんしゃいってこと。
どうもありがとうございます.
単純に考えたら...
お恥ずかしい限りです
覚えておけばいいってのは、変数に入れておけばいいという意味なんだが、伝わらなかったか。
ところで、mallocの引数はひとつだよ。
callocでも意味上では引数の順番が逆だな
ありがとうございます
関数だと駄目なので、変数も駄目だと思い込んでたんですけど
変数の宣言はexternで良かったんですね
> 関数だと駄目なので、変数も駄目だと思い込んでたんですけど
何で駄目だと思ったんだ?
プロトタイプに extern とか書いたのか?
#include <stdio.h>
static void hoge();
int main()
{
puts("main");
hoge();
puts("main");
return 0;
}
static void hoge()
{
puts("hoge");
}
> 変数の宣言はexternで良かったんですね
よくない。
いや、悪くないが、気持ち悪い。
関数内でも、変数は頭に宣言するだろう。
変数を後ろに宣言する何の必要があるのか?
「元も子も」じゃなかったけ?勘違い?
元金と利子だからな
032 #なんだかnandaka
038 #あそこがasokoga
214 #むず痒いmuzugayui
314 #なんでだろnanndedaro
286 #なんだか切ないnanndakasetsnai
↑こんな感じの複数行のテキストファイルがあり、
このファイルを引数で渡すと
数字のみファイルに書きこむプログラム
(#以降はコメントのようにみなす)を
作成していたのですが、変更があって
032 #なんだかnandaka
ne #あそこがasokoga
214 #むず痒いmuzugayui
↑のように数字以外のものがあっても
変換する必要性が出てきました。
今まではisdigit()で済ませていたのですが
それでは2行目の"ne"が弾かれてしまいます。
そこでどのようにすれば#以降を弾きつつ
先頭行の数字以外のデータを書きこむように
できるのかをお教え頂きたくカキコしております。
ほんと厨房で長々と乱文でスイマセソ
5教授お願い致します。。。
書き込むって何に書き込むんだ?
文脈から判断できない
メモリーか?
ああ、わるい。ファイルか。
strchrで#までの長さを求める。
なければ行末までとする。
言い方が悪いな。
strchrをうまく使って長さを求める。
strcspnを使ってもいいけど
isdigitの代わりにisgraphをつかう
C言語でいまCGI作ろうとしているんですが
とりあえず文字表示するだけとかやってみたわけなの
printf("<HTML>");みたいに。
それをコンパイルしてXREAってトコロにUPしてみたの
だけど・・動かないの・・・EXEをCGIにリネームしてUPしたのに。
・・・・なにがわるいんでしょう・・・??
・コンパイルした環境がxreaと違うから
・Content-Typeヘッダーを出力していないから
EXEとか言っているあたりWindows上でコンパイルしたな・・・・
xreaはLinux(CPUはIntel系)だから。
printf("Content-type:text/html\n\n");
こんなん付けていましたが・・・ダメでした・・。
環境はVCなんです。・・うーぬ。
レスありがトン。
トクトクでコンパイルしたものをXREAにアップすれば動くかも
Windowsじゃだめなのですか!!
それは気付かなかった・・っていうか知らなかった〜
Linux対応にするにはどうすればいいか、わかります・・?
strtok(バッファの内容を改変してもいいとき)
もしくは strchr(よくないとき)を使う。
: の後は空白を空ける。
printf("Content-type: text/html\n\n");
Linux 上でコンパイルする。
他のバッファにコピーするならsscanf(src,"%[^#]",dest);こんな感じかな?
Linuxヵー自分全然わかんないッス・・・。
まだ遠い道なのかな・・。
レンタル鯖でCGIするなら、やっぱperlとかの方がいいっしょ。
実験用に自前鯖つくるか
*.cgi の中身ってどんな言語?
ってか、コンパイルされた状態なの?
テキストソースなの?
実行できるなら何でも。
のことならを読めば分かると思うけど・・・
> C言語で
> それをコンパイルして
そういう意味か・・・
標準入出力と環境変数にアクセスする機能があれば言語は問わない。
Cで書かれたものならもちろんコンパイルしないとだめ
確かにそういう意味かもしれんな...。
に補足するなら、サーバが許可してない形式のは実行できなかったと思う。
インタプリタ言語なら、もちろんインタプリタがサーバに置いてないと実行できない。
ホームでインタプリタを自前でコンパイルして使うという手もあるが...。
const struct ABC {int i;} a;
struct ABC b;
ってすると、なんで a しか定数にならないのー?
型限定子なのに
書き換え不能なstruct ABC型のaだからじゃない・・・
何がおかしいんだろ・・・
int findpos(char s[], int lim)
{
int i;
for (i = 0; s[i] != '\0' && i < lim; i++)
{
;
}
if (i == lim)
{
while (i >= 0 && (s[i] == ' ' || s[i] == '\t'))/*@*/
{
i--;
}
}
return i;
}
@の条件が常に偽になるのはなぜなのでしょう?
free()でsegmentation faultが発生するんですが考えられる原因は何でしょうか
・mallocで得た領域でない。
・既にfree済み。
const struct ABC {[?[struct]?] int i;} a;
「困った1」ではなくて「困った」でした。スマソ。
常に偽になるわけないでしょ。
findposに与える引数を工夫してみな。
それ以外にも、ポインタとかの使い方間違えてて、メモリ管理がぐちゃぐちゃになってるとか...。
>変数を後ろに宣言する何の必要があるのか?
関数でも変数でも定義や参照の後ろで宣言するのは意味無いし
,263
1)でした...
静的に確保した領域を開放しようとしてました.
どうもありがとうございました.
それで正常です。
構造体の定義の部分に const をつけても、
その構造体変数を作ろうとした場合に const になるわけではありません。
定義の部分でついでに定義した構造体変数が const になるのです。
常に const になって欲しいんならこんな感じで。
typedef const struct __ABC {int i;} ABC;
ABC a = { 0 };
ABC b = { 5 };
ありがとうございます。
その方向で工夫してみます。
再帰関数を書いたときにauto変数であることを明示するために書いたことがある。
>const struct ABC {int i;} a;
だと
const struct ABC a;
でって、ABCがconstになるわけじゃないですからね。
そもそも、型を定数にしてなんかいいことある?
あえてするなら
struct ABC {const int i;};
かな?
sizeof honyaraと、sizeof(honyara)って何か違いますか?
don't worry.
#define honyara honya + ra
後は自分で考えませう
です。
んー、簡単なプログラムかいて、色々実験してみたんだけど、
結果は、同じになります。
あんまり悩む事じゃないのかな??
それは、そんな定義する奴の方が悪いと思うけど。
じゃ↓を試してみ
#define honyara 7 + 11
printf("%d\n",sizeof honyara );
printf("%d\n",sizeof(honyara));
型に対してsizeofするときは括弧が必要なんじゃなかった?
だからと言ってそんな変な例を出してどうする。
sizeof 単一式
sizoof(型名)
と言うだけのことだろ。規格書ぐらい読めよ。
さん、どうもです。
なるほど、この場合だと結果は違いますね。
自分の環境だと、
printf("%d\n",sizeof honyara );
これは、15になって、
こちらは、
printf("%d\n",sizeof(honyara));
4になりました。
後者は、sizeof(int)をあらわしてると思うのだけど、
前者はなんだろう?
うーむ、、、、考え中...
>sizoof(型名)
>規格書ぐらい読めよ。
プッ
型名に()が必要と言うのは
#define honyara int
や
typedef int honyara;
の場合
そうか?俺は勉強になる良い例だと思うが・・・
ところで単一式なんて単語定義されてたっけ?
sizeof 7 + 11 は ( sizeof 7 ) + 11
sizeof( 7 + 11 ) は sizeof( 18 )
で、あなたの環境の場合 sizeof 7 も sizeof 18 も4だったって事
つまり、一般的には(typedefしない時などは)、両者は同じであるというわけですか?
正直、わかったような、わからないような。
なんだか釈然としないですょ。
なるほど!
非常によくわかりました。
カッコつけることで、優先順位あげてるわけか。
理解しますた。
みなさん、どうもありがとうございました。
いつでも括弧をつけていれば間違いない。
俺は変数に対してはあまり括弧をつけないけど・・・
要は、honyaraの正体を知ってる時は、どっちを使っても構わないが
honyaraの正体を知らない時は()使えって事
また、honyaraの正体を知ってても変更する(される)
可能性がある場合も()使えって事
俺はいつもつけるようにしてるな、
つけないとワードとワードが2つ連続して並んじゃってなんか居心地が悪い
hage + sizeof hoge + huge
↑ここに何も無いのがキモイ
ところで
sizeof(i++)
のように、変数を変化させる事を書いた場合の
ふるまいって、どうなってるの?
sizeofの中味は評価されないんじゃなかった?
i++の型だけが使われて、iの値は変化しないと
変数の大きさに変数の中身は関係ないんじゃ?
手持ちのコンパイラは全て変化しないけど
これが、保証済みだったら良いけど
未定義や処理系定義だったら怖いでふ…
まぁ
#define i j++
とかアホな宣言しなければ良いんですけどね…
C++/C99の規格では、(C99の可変長配列を除いて)オペランドは評価されない。
となってる。
#include<stdio.h>
main()
{
putchar(126);
}
だと ~ が表示される.(~のコードが126だから)
しかし 。 のコードは130のはずなのに,
#include<stdio.h>
main()
{
putchar(130);
}
と打っても結果が表示されません.これに関して,130〜159までが表示されないみたいなんですが,なぜなんでつかー??おせーてくらさい.
130のコードが'。'では無かったから
isgraph()で調べてみたら。
スペース以外の表示可能文字なら0以外を返す。
。 は 161(0xA1) だと思います。
129(0x81) 〜 159(0x9F) はSJISでは2バイト文字用の
文字コードなので、単独では何も表示されません。
putchar はコードを文字に変換出力しますが,その逆(文字をコードに)をしてくれる命令はありますか??
誰も突っ込んでくれない…鬱
勉強になります.ここはレベル高杉ですね
助けて下さい。
#include <iostream.h>
#include<stdio.h>
void main()
{
FILE *fp;
fp=fopen("素数−実行結果.txt","a");
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}
printf("%d個です。",c);
}
素数を表示するプログラムなんですが、
実行結果をテキストファイルに出力するにはどうしたら良いですか?
教えて下さい。御願いします。
ちなみに、コレを実行しても、作成されたテキストファイルは白紙になってしまいます。
printf( "A=0x%02x\n", 'A' ) ;
てっとり早くやるなら、そのプログラムの名前をtestとしたら、
test > hoge.txt
ってしたら、いいんじゃねーか?
面倒くせーから、まともなやりかたは、他の人に聞いてくれ。
お前最悪。
マルチポストかよ。
氏ね。
実行結果をテキストファイルに出力する仕方を教えて下さい。
御願いします。
なかなかうまくいかないんです。
マルチポストなのでIP抜いて通報しますた
マルチポストってなんですか?
複数のスレッドに同じことを投稿する違法行為。
知らなかったじゃ済まされないのが犯罪。
すいません。
いえ、あちらの方に、MFC限定と書いてあったので、
書き込んだ後で、違うかも知れないと思って、こっちに来たんです。
だから、他には投稿してないです。
ム板はやたらスレが細分化されてるからなあ。
マルチポストと移動の違いが分からない罠。
ならそう書けよ……
迷惑掛けてしまったみたいで恐縮なんですが、
どうしたら、うまくテキストファイルに出力できるか、
教えて下さい。御願いします。
マルチポストが何故いけないのかちゃんと調べておこうな。
移動はちゃんと移動したと書いてある。
マルチポストと勘違いされるのを防ぐのにな。
「レゴは
素直に
単位を
落とせ。」
向こうにレス付いてたよん。
>書き込んだ後で、違うかも知れないと思って、こっちに来たんです。
1、書き込む前に確認する
2、移動する時は、必ず、移動すると元スレに書き込んでから移動する
以上、基本ですので憶えて置きなはれ
追記
反省してるならMFC限定スレにも謝っておく事
それは C++ だが、ここは 「C 限定」 なんだよな。
316>>
はい、分かりました。
317>>
単位というか、研究室に入れなくなってしまうんです。
fprintfの使い方分かる方、教えて下さい。
読んだ?
読んだんですけど、C言語というと、C++も入ってるんですかね?
違うけど、言葉的に入ってると思ったんですが。違うのでしょうか?
間違ってたら、すいません。
FILE *fp,*fc;
fp=fopen("素数−実行結果.txt","w");
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}
printf("%d個です。",c);
fc=fclose("素数−実行結果.txt","w");
と入力したのですが、エラーが出てしまいました。
はっきり言われないとわからないか。
の 2 行目は呼んだか?
あと、C と C++ は全然別言語だ。
326>>
はい。
自分で色々調べたり、先輩に聞いたんですけど、
ここまでしか分からなくて。
本当に頭悪くて、すみません。
それでは、失礼します。
まずfopenとfprintfとfcloseの使い方をおぼえたほうがいいな。
なんでfpにファイルをオープンしたポインタを代入してるのにcoutに出力してんだ?
fpをまったく使わない時点でおかしいと思わないのか?
えっ?
fpに出力ですか?
coutは、使わないんですかね?
初めに素数を表示するプログラムが完成した後で、
テキストファイルに出力出来るようにしようとしたので、
分からなくなったんです。
ちょっと、いじってみます。
優しいね…
C++として組みたいならXXstream使え(XXは自分で探せ)
何が簡単で、何が簡単ではないかは、使う人の考え方次第
それにネットで検索すればfprintf()の使い方なんて簡単に見つかる
そして、ルールは守れ。
何処で聞けば分からなければ、この板のルールの↓を守って
>あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。
http://pc3.2ch.net/test/read.cgi/tech/1043159083/ に書きこんでれば、一発で誰かが答えてくれる問題だった
まぁ、今更書いたところで、答えてくれる香具師がいるかは分からんが…
取り敢えず、が付き合ってくれてるので
Cに直した答えを教えてくれるかも知れないが
C++にしたいのなら明日あたり↑のスレで聞いてみ
今日は優しい人が多いね…
いつからレゴはC++になったんだ?
の 「助けて下さい。」 のすぐ次の行から。
サソ
アリガdございますた。
アドバイス頂いておいて何なんですが、
正直strchrを使って"#"以降を弾くのかわかりません。。。
ほんと糞厨ですみませんが、もう少し
5教授頂きたく思います。
お手数お掛け致しますが宜しくお願い致します。
C言語の、多分基礎のところだと思うんですけど質問します。
int AAA = BBB != CCC ? DDD:EEE ;
この1行を要約すると、
if( BBB==CCC ) int AAA = DDD ;
else int AAA = EEE ;
ということでよろしいのでしょうか?
int AAA;
if( BBB!=CCC ) AAA = DDD ;
else AAA = EEE ;
>340さま
ありがとうございました。m(__)m
1. 一行読み出す
2. #の位置を探す
3. 見つかれば、そこまでを書き出す
4. 見つからなければ、全部書き出す
でできます。
一文字ずつ読み出す場合はこういうことできないんですけどね。
一文字ずつ読み出すと何度も読み出し作業があって遅くなるので、
一度にある程度読み出すことが多いです。
まぁ、一文字ずつ読み出す場合であれば、
isdigit とかの関数を使わずに
'#' かどうか判定するのが一番真っ当なやり方でしょうね。
C言語の長所と短所を教えてください。
長所: 簡潔であること。
短所: 簡潔すぎること。
サソ
アリガdございます
相変わらず糞厨なもので。。。
3. 見つかれば、そこまでを書き出す
4. 見つからなければ、全部書き出す
上記3.4のコーディング方がわかりませぬ・・・
まじオワッテルって感じなんですけど、
御教授願いたく再度ペコーリでございます。
3. 位置の差を使って fwrite
4. fputs
何で分岐するかは strchr のヘルプを見れば分かるはず。
fgets で一行読み出そうとしても、
バッファが小さいと一度に一行全部読み出せるとは限らないので、
その対処をする必要があります。
全部読み出せたかどうかは最後が改行かどうかで分かります。
具体的な形については、全部自分でやってください。
じゃだめ?確認していないけど。
一行読んだものを格納するバッファとは別にもうひとつバッファをつくってそこにsscanf
位置の差を取るくらいならstrcspnを使えばいいじゃん
'#'を探して見つかったらその位置とその次に'\n'と'\0'を置く。
行バッファなんか要らないじゃん。
fopen(fpin=入力、fpout=出力)
while(!feof(fpin)) {
fgetc(cに1文字読む);
if(c=='#') {
fputc('\n',fpout);
while(!feof(fpin)) {
fgetc(cに1文字読む);
if(c=='\n') break;
}
}
else {
fputc(cの1文字を書き込む,fpout);
}
}
両file close
exit(0);
氏ね
(^^)
山崎渉も氏ね
(××)
ワロタ
C言語が全然分かりません(>_<)
どうしたらいいですか(>_<)
ほうじ茶を飲むといいですよ (-:
C言語でほうじ茶のプログラムを書く方法を教えてください(>_<)
/
∋8ノハヽ8∈ |
( ´ァョ) < こーするのれす
|
printf("ほうじ茶のプログラム");
C言語でいい参考書ありませんか?やさしいCとC言語スタートブックは読んだのですが
次になにを読めばいいのか迷っています、それともはやめにC++の方に移った方がいい
のでしょうか?
ありがとう
ど素人な質問でスミマセン。
ファイルから1バイトおきにデータを読み込みたいのですがうまくいきません
なぜこれではダメなのでしょうか?
FILE *fp;
char ch;
.......
while(!feof(fp)){
ch=fgetc(fp);
putchar(ch);
fseek(fp, 1L, SEEK_CUR);
}
FILE *fp;
char ch;
.......
while(!feof(fp)){
ch=fgetc(fp);
putchar(ch);
fgetc(fp);
//fseek(fp, 1L, SEEK_CUR);
}
> while(!feof(fp))
終了条件がこれはマズイだろ。
文字を数値に変えるのはatoiとわかりました。
数値を文字に変えるのはitoaですか?
はい
aprintf()
間違い。
sprintf()
fgetc の戻り値で終わってるかどうか確かめましょう。
また、fgetc の戻り値は int なので int で受け取りましょう。
FILE *stream;
char buffer[81];
int i, ch;
................
/* 最初の 80 バイト文字を読み出し、"buffer" に格納します。*/
ch = fgetc( stream );
for( i=0; (i < 80 ) && ( feof( stream ) == 0 ); i++ )
{
buffer[i] = ch;
ch = fgetc( stream );
}
...................
1週間位前から、snprintfを実装してた者です。
本日作成終了しました。とりあえず感想等を書いてみます。
文字列フォーマット後のサイズを計算して、
オーバーフローしないなら、
内部でvsprintfを呼ぶ様に実装しました。
でも、何箇所か精度の甘い部分が残りました。
変換指定子g,Gはeかfのどちらかに変換されるらしいけど、
どちらに変換されるか判らないからサイズは大きい方で
計算したり、フラグ#は最小フィールドが指定された時には、
サイズがフィールド幅足す2なのか、最小フィールド幅内に含めるのか等
他の人には簡単なのかも知れないけど、
私には難しかったです。そしてめんどくさかった。
strtok使ってみたら?
ヌヒよ、それは実装とは言わないぞ。
ヌヒよ、それは単に作成というぞ。それは単なる関数だからな。
ヌヒよ、実装というのは関数ではなくインターフェイスを定義することだ。
なんでfread使わないんだろう…
CRLF -> LF
勘違いした。
377 の言う通りだ。
お前それじゃ、本物の沢村より DQN だぞ。
が本物であるかも知れない罠
本物ならあんな文の書き方しないよ。
修行が足りないね。
1 6
2 7
3 8
4 9
5 10
↑これを
(a=1;a<6;a++){
(b=a;b<=10;b+=5)
printf("%d",b);
printf("\n");
こうじゃなくて12345と数字の順番に表示させていくにはどうしたらいいですか
聞く前に動くコードを出せ
printf("12345\n678910");
何をやりたいのか見当がつかん。
どういう出力結果が欲しいんだ?
ごめん、コードはまた今度な。
俺が思うに、1 6\n2 7\n3 8・・・と表示してゆくのではなく、
1から5までを表示したあとに一番上の行間で戻って少し右にずらし6から10までを表示したいんだと思う。
× 行間で
○ 行まで
1 6
2 7
3 8
4 9
5 10
↑これを
#include <stdio.h>
int main(void){
int a,b;
for(a=1;a<6;a++){
for(b=a;b<=10;b+=5)
printf("%3d",b);
printf("\n");
}
}
こうじゃなくてああ
1 6
2 7
3 8
4 9
5 10
↑こういった出力結果が欲しいだけなんか?
だったら
int i;
for (i=1; i<=5; i++)
printf("%d %d\n", i, i+5);
これでええやん。
俺も当初そう思ったんだけど,
を見る限り1 -> 6 -> 2 -> 7と表示させようとしてるような。
1 2
3 4
5 6
7 8
9 10
「こうじゃなくてああ」と書いているから違うコードがほしいんじゃない?
あ, そっか。ごめん。
strtokはワークエリアが一つしかないので、だぶって使ったら
ダメだということです
なんの話だ
よう分からんけど、の環境で
同一プロセス内のスレッドが複数ある時の話じゃないか?
「Java 謎+落とし穴」のp50参照
C言語って関数内関数が使えないはずですよね?
gccだと通っちゃうんですが。何故?
gccが独自拡張してるからだYO!
-ansi -pedantic-errors
の、「ANSI準拠以外認めない」オプション付けたらエラーになる筈
ところで
、61
の掛け合いに激しくワラタんだが、
反応ないのをみるに、これって激しく既知のネタ?
知らなんだ。イイ! ね。
特に作業用の引数が必要な再帰関数使うときとか。
サンクス
というかなんで標準Cじゃ使えないんだよヽ(`Д´)ノ
スコープがちょっと違うだけだろうが!
配列の範囲チェックを省きたいんですけど、
こんなのありなんでしょうか?
struct aaa
{
int d1[10];
int data[10];
int d2[10];
};
aaa l;
l.data[-1]=1; //d1[9] //anti bad_alloc
l.data[-2]=222; //d1[8] //anti bad_alloc
添え字に負数入れてもコンパイラはエラー吐かないんだな。びっくりした
a[n] == *(a+n) と解釈されるから当然といえば当然か。
-pedanticまでつけなくてもいいんじゃないか?(笑)
以前試しにつけたら、//コメントはおろか標準にない関数をつかっただけでもエラーになった気がする。
C++使い?
>というかなんで標準Cじゃ使えないんだよヽ(`Д´)ノ
一見簡単そうだが、意外に厄介な問題が潜んでいるので・・・
まともな関数内関数の実装はスタックフレームにも影響あるからね。
C++やJavaのメソッド内クラスみたいな制限つきでも十分便利なのにな。
亀レスで悪いが...
> 要は、honyaraの正体を知ってる時は、どっちを使っても構わないが
> honyaraの正体を知らない時は()使えって事
と言うより、
#define honyara honya + ra
なんて宣言する奴が悪い。普通...
#define honyara (honya + ra)
って宣言するだろ。
規格書も読めないんだね。 ぷぷっ。
> #define honyara (honya + ra)
> って宣言するだろ。
このくだらないつっこみのために遅レスしたの?
> #define honyara (honya + ra)
> って宣言するだろ。
#define honyara ((honya) + (ra))
>このくだらないつっこみのために遅レスしたの?
規格書を読んでいた為ではないかと。
あんたの意味なし煽り突っ込みよりマシかと。
趣味の差かと。
念には、念を入れると言う考え方もあるけど、俺はマクロ側で () 必須にするのが好み。
それもあるが、毎日 2ch 見てるわけじゃないし...。
>俺はマクロ側で () 必須にするのが好み。
#define a(b) (b * 5)
printf("%d\n", a((4 + 8)));
という意味だったら死刑。
まあ、話の流れからわかるでしょ ?
「マクロの定義側で」と書いた方がいいか...。
煽ったつもりはないですけど。
煽っているのはの方でしょ。
これ (=このくだらないつっこみのために遅レスしたの?) 書いといて...
> 煽ったつもりはないですけど。
と来たか...。
で煽りがないとは言わんけど、は見てんのかなぁ。
驚いたので感想を書いただけです。
亀レスでなければ驚きもしないですけど。
くだらないという表現がまずかったでしょうか。
> 驚いたので感想を書いただけです。
マジなのか、ネタ (だと思いたいが) なのかわからんけど。
まああんたみたいな奴も世の中にはいるということはわかった。
> 亀レスでなければ驚きもしないですけど。
自分で亀レスって書いといてなんだけど、2日と17時間ぐらいが、驚くほど亀レスか ?
君と違って、毎日 2ch 見てる香具師ばかりじゃないんだよ。
> くだらないという表現がまずかったでしょうか。
相手に対して、「くだらない」と言う表現がまずくない場合があるとでも思ってんの ?
2chだからね。
1.構造体のメンバが宣言順にアドレス増加方向で並ぶのは保証されている
2.配列内の要素はアドレス増加方向で並ぶことが保証されている
3.アドレス演算は+で増加方向、-で減少方向が保証されている
だが、
4.構造体の中身が隙間無く並ぶことは保証されていない
に引っかかって誤動作することがあると思われ。
sizeof(int)=4,sizeof(short)=2として、
struct mix{
short a[1];
int b[1];
short c[1];
};
だと、恐らくmix.c[-3] != mix.a[0]になると思う。
ただそれよりも何よりも、そんな危険な匂いのするコード個人的に嫌だw
あんな書き込みでは2日と17時間でも驚くよ。
大抵は思っても書き込んだりはしないんじゃないかな。
要は2日と17時間経ってからレスしたことに驚いたんじゃなくて、あんなレスを2日と17時間も経ったあとにしたことに驚いたということ。
ハイハイ、わかりました。
わかればいい。
二次元配列を引数にとるにはどうすればいいんですか?
int dat[100][100];
void func(int *param);
main(){
func(dat);
}
のようにやっても、うまくいきません。
void func(int** param);でもだめでした。
教えてください。
-3じゃなく-4かもね、それ。
void func(int param[][100])
void func(int (*param)[100])
void func(int param[][100]);
ありがとうございます。
でもそれだと、要素数が100に限定されてしまいませんか?
限定される。
ポインタの指すものの大きさが分からないとだめだろ。
そもそも配列の範囲外へのアクセスは保証されないよ。
しつこい、お前等ウザイからどっか逝け。
void func(int param[][100])
多次元配列の最上位の次元以外の範囲は省略できない。
よくわかりました。どうもありがとうございました。
int data[100 +2], *p;
p = data +2;
とすれば、p[-2], p[-1] が有効に使えるね。
こうやればできる。
#include <stdio.h>
#define ELEMOF(array) (sizeof (array) / sizeof *(array))
void func(int* param, int n)
{
param[n * 3 + 6] = 3; /* a[3][6] = 3;
}
main()
{
int a[10][20];
func(*a, ELEMOF(*a));
printf("%d\n", a[3][6]);
}
あ、コメント閉じるの忘れてた。
param[n * 3 + 6] = 3; /* a[3][6] = 3; */
それだと2次元配列の見易さや配列の大きさについての
情報が無くなるから・・
void func(int *param,int n){
/*nは1列の要素数*/
*(param + 3 * n + 6) = 3;
}
と大差ないと思われ。
これなら通ることは恐らくも確認済みと思う。
関係ないが、関数の中にマジックナンバーを仕込むのは
サンプルコードでも止めて欲すぃ・・
==413
>sizoof(型名)
>規格書ぐらい読めよ。
規格書読む前に、アルファベットの綴りを覚えろよ
typo ぐらいでがたがた言うな。
エラそーに能書きを垂れる時にミスったらアカンやろ
数字だと瞬間での同一性の確認が得られるから、
こういうサンプルではマジックナンバーもアリかと思って。
あと、もし第二要素数の異なる二次元配列を扱うのであれば、
それと大差ないのは仕方がないんじゃないかな。
まぁ、
#define INDEX2(n2, a, b) ((a) * (n2) + (b))
とかして
param[INDEX2(n, 3, 6)] = 3;
とでもすればいいかと。
もちろん要素数固定ならこんなことする必要ないんだけどね。
が趣味の差かよ!!
ルパーン お前をタイポする〜〜
タイポしてないじゃん
#include<stdio.h>
#include<stdlib.h>
int main (void){
int k,nsize;
int *pnVar;
printf("確保する大きさ");
scanf("%d",&nsize);
pnVar= (int *)malloc(sizeof(int)* nsize);
printf("%dバイトの領域を確保しました\n",4*nsize);
for(k=0;k<nsize;k++);
pnVar[k]=k*10;
for(k=0;k<nsize;k++);
printf("pnVar+%d=%p pnVar[%d]=%d\n",pnVar+k,k,pnVar[k]);
free(pnVar);
return 0;
}
何故かエラーがでます。
授業の板所を間違えて写してしまったのでしょうか
どなたか対処法をおねがいします。
マロック関数です
お前はその前に日本語を学びなおせ。
for文の後にいきなりセミコロンがあるが、それはどうなのよ?
↑お前ね、煽り方がふるくせんだよ。 ジジイかよ
Stack overflowと言うエラーは何ですか?
ヒソヒソ( ゚o゚)ヤダァ(゚o゚ )ネェ、キイタ?( ゚o゚)オクサン(゚o゚ )アラヤダワァ
大学の研究でいきずまってるんですけど。助けてください。
まず仕事の数を入力して次に仕事の内容を入力して次に仕事別に分けたいのだけどどうしたらいいの?
ちなみに仕事は丸ブローチ加工、角ブローチ加工、キーみぞ加工の3種類です。
マロック関数ですか。
なんだか新鮮ですな。
バカ?
質問が漠然としてるな
いまいちわからない
研究にかかわってない人間でもわかるように質問して
マイコンで旋盤制御でもやるつもりか?
お手製のNC旋盤
少しおちついて考えればすぐ解ると思うが、
for(k=0;k<nsize;k++);/* k が nsize になるまで空回り*/
pnVar[k]=k*10;/* ここでは k は nsize と同じ値になっている*/
となっている。
451じゃないが、for文直後のセミコロンはいったい何なんだと小3分ほど(w
intの大きさをsizeof(int)と書いているところもあれば4と決めつけているところもあるね。
あ、エラーとはなんの関係もないよ。
include<stdio.h>
void main()
{
long sum=0;
short ten[10],i,n;
printf(“仕事数の入力(10個以内):”);
scanf(“%2d,&n);
for(i=0;i<n;++i){
printf(“%2d個目の仕事の入力:”,i+1);
scanf(“%s”,&ten[i]);
sum=sum+ten[i];
}
if(?){
printf(“丸ブローチ加工です。\n”);
}
}
ここで()のなかの条件式がわかりません。仕事の内容を入力する時にmと入力されれば
”丸ブローチ加工”です。と表示したいのです。初心者なのでよろしくおねがいします。
まずは全角のダブルクォーテーションをなんとかしろ。
次に、なんでshortに文字列を入れようとする?
charにすればいいんですか?
sumって何に使うの?
アムロの(ry
木下君のやりたいことを想像してみよう
オリンピックで金メダルを取ること。
下記のようなプログラムを作成中の厨房です。
/* int hoge */
while((hoge = fgetc(fpin)) !=EOF){
if(hoge=='#'){
fputc('\n',fpout);
while(!feof(fpin)){
hoge=fgetc(fpin);
if(hoge=='\n') break;
}
}
else {
fputc(hoge,fpout);
}
}
*fpoutの示すファイルにバイナリで書きこみたいので
fwriteを使いたいのですが、いまいち使い方が
わかりません。特にfputc('\n',fpout);のところです。
'\n'をどのように引数で渡せばよいのでしょうか?
糞みたいな質問で申し訳ありませんがよろしくお願い
致します。
> fputc('\n',fpout);
fwrite(&'\n', 1, 1, fpout);
でも、1文字書き込みたいだけならfputcの方がいいと思うが...
> &'\n'
これはCなのか?
てか、"\n"でええやん。
スタックがオーバーフローするエラー。
スタックってのは
自動変数(関数内で普通に定義した変数)、
関数の引数、関数の呼び出し元のアドレスなどを
保存しておくところ。
オーバーフローってのは、容量オーバーすること。
つまり、
1. 自動変数が大きすぎる・多すぎる
2. 関数呼び出しが深すぎる
って時に起こるエラーです。
普通は再帰関数の終了条件が満たされなくなるようなバグがあったときか、
3次元以上の配列を確保したが予想以上に大きくなってしまった、という時に起こります。
初心者で,数値計算[円周率]のプログラムをC言語でつくりたいのですが
何をしたらいいかわからず,何か参考になるネタはありますか?
検索すればその手の例題は結構あります。
みなさんありがとうございやす。
言うと殴られちゃうぬるぽってC言語のNULLのことじゃないんですよね??
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 /<<479
ミナサン
ご回答ありがdございます。
while((s = fgetc(ifp)) !=EOF){
if(s=='#'){
fwrite("\n", 1, 1,ofp);
while(!feof(ifp)){
s=fgetc(ifp);
if(s=='\n') break;
}
}
else {
fwrite (&s, 1, 1, ofp);
}
}
上記のように直したのですが
ファイルにはNULLしか入ってないっす・・・
まじ厨でもうしわけないのですが
ご教授お願い致します。
fwrite を使うか fputc を使うかで
バイナリかテキストかは切り替わらないので、
どっちを使っても問題ありません。
というか、
fwrite (&s, 1, 1, ofp);
は危険な(環境依存な)コードなので
fputc 使って下ちぃ。
サソ
ご丁寧な回答ありがdございます。
fputcを使うべしとのことですが
fputcはバイナリで書きこむことが
可能なのでしょうか??
環境依存なの?
CPUはなんだ? なんとなくx86系じゃないような香りがする。
int型のs(多分fgetcを受ける変数なんでintなんだろう)を
*(char*)&s;
と評価したときの値は環境に依存するよ。
fwrite(&s, 1, 1, ofp);
なんてやってる場面はまさにそれ。
ぐぉーーなんか複雑だぁ。
CPUは・・・?よくわかりますぇん。。。
OSはUNIX、ソラリスであることは
間違いないっす。
fputcじゃーバイナリでカキコは無理なんで
しょうか・・・
するとsparcかな。エンディアンしらねえや(w
でも書いたファイルがヌルだらけという状況からいって、
ビッグエンディアンっぽいね。
ともかくその場面ではfwriteを使うんじゃなくて、fputcを使うべし。
fputcは文字をストリームに書く関数というよりは、
一バイトストリームに書く関数って感じなので、バイナリ書けるよ。
何か「バイナリ」という言葉を勘違いしている予感。
というか、何をしたいの?
#があるとその行のそれ以降のものを消すコード、
というのなら最初ので合ってるような気が。
サソ
アリガトウゴザイマス
確かに漏れバイナリわかってません。。。
32#more
44#baka
nanoka #utsuda
↑こんな感じのテキストファイル読み込んで
(#以降はコメントの扱いとして省く)
バイナリでファイルに書きこむっていう
プログラムを作っています。
putcでバイナリで書きこめるのであれば
私の仕様でもダイジョウブなんでしょうか?
最近夢にバイナリが出てきます。
鬱です。
32 とか 44 とかをバイナリで書き込むんですね?
でも、nanoka とかバイナリもテキストもないと思いますが
どういう仕様にしたいのでしょうか。
サソ
アリガdゴザイマス!
おっしゃる通りでして
"nanoka"はそのままカキコで
OKであります。
32やら44をバイナリで書きこみたい
のです。
ご教授お願い致します。
300get#300geto-
という場合はどうなんでしょう?
何にせよ、fgets で一行読み込んでから処理する方が楽な気がします。
age
サソ
fgetsのほうがよいですか。。。
while(fgets(buf, 256, ifp) !=NULL){
for(src=buf, dst=tmp; *src; src++){
if(*src == "#")
*dst++=*src;
}
*dst='\0';
こんな感じでいけますかねぇぇ。。。
atoi って知ってる?
ぬ★ぽなら知ってる
hoge = atoi(tmp);
でしか?
走査していって数字が見つかれば atoi、
見つからなければ1文字出力、
を続けていけばいいんじゃない?
フセジ カコワルイ
サソ
500ゲトの暁にそのコード書いて
くださひ。。。
もうアタマがオーヴァーヒートして
だめぽ。。。
ヒント挙げすぎちゃったかなと思ってるくらいなのに...。
ソウナンデスヨネェ
まだC言語触って2週間なのに・・・
こんなん漏れに与えるヤシがおかすぃ。
ほんとおながいしますっ!
ほらよ。行数多すぎとか言われたんで入るように手を加えた。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char * argv[]) {
char s[512], *p;
FILE *ifp, *ofp;
if (argc != 3) {
fputs("usage: hoge <in> <out>\n", stderr);
return 0;
}
ifp = fopen(argv[1], "rb"); ofp = fopen(argv[2], "wb");
if (!ifp || !ofp) {
perror(NULL);
return 3;
}
while (fgets(s, sizeof(s), ifp)) {
if (p = strchr(s, '#')) *p = '\0';
else if (p = strchr(s, '\n')) *p = '\0';
if (isdigit(*s)) {
int i = atoi(s);
fwrite(&i, sizeof(i), 1, ofp);
}
else
fputs(s, ofp);
fputc('\n', ofp);
}
fclose(ofp); fclose(ifp);
return 0;
}
32 行までな。
どなたか文字列指数をdouble型へ変換する最も効率の良い方法しりませんか?
"3e-5" を 0.00003とする場合など。
お願いします!!
double a;
sscanf("3e-5", "%g", &a)
ものすごくあっさりできるのですね。
ちなみに反対の変換はfcvt()でOKでしょうか?
sprintf()
サソ・・・
ふぉんとにありがdございます。
家に着いたらそこには宝があったよー!!
(゚д゚)ウマー(゚д゚)ウマー(゚д゚)ウマー
とりあえずケコーンしてくだはい。
あ、当方、29歳女、バツ2です。
・・・などとプロフィールを勝手に書いてみるテスト・・・
printfをラップしたいのだが、訳あってvprintfは使えないとき、
int myprintf(const char *format, ...){
return printf(?????);
}
こんなことは出来ないよねえ。
可変個引数をとる関数とva_listをとる関数はセットで用意しておくべき物なの?
質問の趣旨がわからないんだけど・・・。
29じゃ、すでに女じゃないな
淑女です
質問なのですが、
文字をそのままにして計算させることは可能でしょうか?たとえば、
double a=1.2, b=2.3, c, d;
d=a+b+c;
で、“d=3.5+c”と計算させたいのです。
誰か教えてください!出来れば、leap=で始まっている2ヶ所を関数にしたいんですが、どうしたらいいでしょう?
そうじゃなくてもこれをもっと短くする方法ってありますかね?
#include <stdio.h>
main()
{
static int days_data[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},Feb=28;
int i,days1,y1,m1,d1,days2,y2,m2,d2,leap,lapse,ydays;
printf("初めの年月日を入力してください : ");
scanf("%d %d %d",&y1,&m1,&d1);
printf("終りの年月日を入力してください : ");
scanf("%d %d %d",&y2,&m2,&d2);
leap=(y1%4==0 && y1%100!=0)|| y1%400==0;
days_data[2]=Feb+leap;
days1=d1;
for(i=1;i<m1;i++){
days1+=days_data[i];
}
leap=(y2%4==0 && y2%100!=0)|| y2%400==0;
days_data[2]=Feb+leap;
days2=d2;
for(i=1;i<m2;i++){
days2+=days_data[i];
}
ydays=0;
for(i=y1;i<y2;i++){
leap=(i%4==0 && i%100!=0)|| i%400==0;
ydays+=365+leap;
}
lapse=(ydays+days2)-days1;
printf("経過日数は%d日です\n",lapse);
}
一瞬ドキッとしたじゃねえかゴルァ(w
放置??他スレで聞くYO!
2 時間もしないうちにそれを言うか?
可能か不可能かと言われれば可能だろうけど、自分でインタープリタ作る事になるよ。
元年1日(西暦)を1日(延べ日数)とした時の
西暦から延べ日数(i)への変換法(y=year,m=month,d=day)
if(++m<4)y--,m+=12;
i=365*y+y/4-y/100+y/400+306*m/10-428+d;
書きこんだ時点では結構回転早そうだったので・・。
朝までにプログラム作る必要があったので急いでたのでつ。
他スレ逝って来ました。レスサンクスでした。
そろそろテストが始まるのでage
ヒロユキ氏ね 俺が、のスレでプロキシー奇声すんな〜
int
┏━━━━━┳━━━━━┳━━━━━┳━━━━━┓
char ┃ ┃ ┃ ┃ ┃
┃ 1 ┃ 2 ┃ 3 ┃ 4 ┃
┃ ┃ ┃ ┃ ┃
┠─────╂━━━━━┻━━━━━┻━━━━━┛
┃ ┃
┃ 2 ┃
┃ ┃
┃ 3 ┃
┃ ┃
┃ 4 ┃
┃ ┃
┗━━━━━┛
列*
┏━━━━━┳━━━━━┳━━━━━┳━━━━━┓
行** ┃ [0] [0] │ [0] [1] │ [0] [2] │ [0] [3] ┃
┠─────┼─────┼─────┼─────┨
┃ │ │ │ ┃
┠─────┼─────┼─────┼─────┨
┃ │ │ │ ┃
┠─────┼─────┼─────┼─────┨
┃ │ │ │ ┃
┗━━━━━┷━━━━━┷━━━━━┷━━━━━┛
お前のせいでな〜大事なヒトと話できなかったんだYO!
列*
┏━━━━━┳━━━━━┳━━━━━┳━━━━━┓
行** ┃ [0] [0] │ [0] [1] │ [0] [2] │ [0] [3] ┃
┠─────┼─────┼─────┼─────┨
┃ [1] [0] │ [1] [1] │ [1] [2] │ [1] [3] ┃
┠─────┼─────┼─────┼─────┨
┃ [2] [1] │ [2] [1] │ [2] [2] │ [2] [3] ┃
┠─────┼─────┼─────┼─────┨
┃ [3] [1] │ [3] [1] │ [3] [2] │ [3] [3] ┃
┗━━━━━┷━━━━━┷━━━━━┷━━━━━┛
列*
┏━━━━━┳━━━━━┳━━━━━┳━━━━━┓
行** ┃ [0] [0] │ [0] [1] │ [0] [2] │ [0] [3] ┃
┠─────┼─────┼─────┼─────┨
┃ [0] [4] │ [0] [5] │ [0] [6] │ [0] [7] ┃
┠─────┼─────┼─────┼─────┨
┃ [0] [8] │ [0] [9] │ [0] [10] │ [0] [11] ┃
┠─────┼─────┼─────┼─────┨
┃ [0] [12] │ [0] [13] │ [0] [14] │ [0] [15] ┃
┗━━━━━┷━━━━━┷━━━━━┷━━━━━┛
折れが、作ったアスキーアートだ・・・。使ってくれ
1:事実に対して仮定を持ち出す
「犬は子供を産むが、もし卵を生む犬がいたらどうだろうか?」
2:ごくまれな反例をとりあげる
「だが、時として尻尾が2本ある犬が生まれることもある」
3:自分に有利な将来像を予想する
「何年か後、犬に羽が生えないという保証は誰にもできない」
4:主観で決め付ける
「犬自身が哺乳類であることを望むわけがない」
5:資料を示さず自論が支持されていると思わせる
「世界では、犬は哺乳類ではないという見方が一般的だ」
6:一見関係ありそうで関係ない話を始める
「ところで、カモノハシが卵を産むのは知っているか?」
7:陰謀であると力説する
「それは、犬を哺乳類と認めると都合の良いアメリカが画策した陰謀だ」
8:知能障害を起こす
「何、犬ごときにマジになってやんの、バーカバーカ」
9:自分の見解を述べずに人格批判をする
「犬が哺乳類なんて言う奴は、社会に出てない証拠。現実をみてみろよ」
10:ありえない解決策を図る
「結局、犬が卵を産めるようになれば良いって事だよね」
11:レッテル貼りをする
「犬が哺乳類だなんて過去の概念にしがみつく右翼はイタイね」
12:決着した話を経緯を無視して蒸し返す
「ところで、犬がどうやったら哺乳類の条件をみたすんだ?」
13:勝利宣言をする
「犬が哺乳類だという論はすでに何年も前に論破されてる事なのだが」
14:細かい部分のミスを指摘し相手を無知と認識させる
「犬って言っても大型犬から小型犬までいる。もっと勉強しろよ」
15:新しい概念が全て正しいのだとミスリードする
「犬が哺乳類ではないと認めない限り生物学に進歩はない」
16:反論の代わりに詭弁ということにしてすます。
「それは詭弁です。いいから詭弁なんです。」
質問ですが、文字列
"\t\t\tABCD\t\t\t\t1234"
とあって、
char *buf1;
char *buf2;
sscanf("\t\t\tABCD\t\t\t\t1234\t\t","%s%s",buf1,buf2);
とするようなコーディングでbuf1にABCD、buf2に1234と入りますか?
他に簡単に格納する方法がありますか?
> buf2に1234と入りますか?
試してみればわかる。
sscanfを使う前に、mallocでも使って領域を確保しておけよ。
今コンパイラがなく、机上でコーディング考えてるんで…。
お願いします。
入るけど、。
了解しました。
ありがとうございました。
#include <stdio.h>
main()
{
int y,m;
int c[13],d[13];
long z,n,k,r;
int kara,made,i;
printf("A.D. ");
scanf("%d",&y);
printf("Month ");
scanf("%d",&m);
printf("n");
printf(" SUN");
printf(" MON");
printf(" TUE");
printf(" WED");
printf(" THU");
printf(" FRI");
printf(" SATn");
d[1]=31; d[2]=28; d[3]=31;
d[4]=30; d[5]=31; d[6]=30;
d[7]=31; d[8]=30; d[9]=30;
d[10]=31; d[11]=28; d[12]=31;
if(((y%4==0)&&(y%100!=0))||(y%400==0))d[2]=29;
c[1]=0;
for(i=1;i<11;++i){
c[i+1]=c[i]+d[i];
}
z=y-1601;
k=z/4 - z/100 + z/400 +1;
n=365*z+k+c[m];
r=n%7;
kara = 1-r;
while(kara<=d[m]){
made=kara+6;
if (made>d[m])
made=d[m];
for (i=kara; i<=made; ++i){
if (i<=0)
printf(" ");
else
printf(" %5d",i);
}
printf("n");
kara+=7;
}
printf("nn");
}
これを修正して欲しいのですが(全部表示されない月があります)
事故解決しました
× d[10]=31; d[11]=28; d[12]=31;
○ d[10]=31; d[11]=30; d[12]=31;
Cでは、いわゆるオーバーロードはできません。
これは可変長引数。printfみたいな。
あーなるほど。可変個の引数ですか。
確かにfcntl.hでは三番目は...となっていますね。
flagsによって三番目の引数があるかないか判断しているのかな。
ありがとうございました。
超超初心者です。
あるソフトのパッチを当てるのに
バイナリデータの変更で
0000E76A: 56 3b
と書いてあるのですがどういういみですか
本当に初心者ですね。
聞くべきスレッドを間違えるなんて。
スレ違いどころか板違いか。
追記
別のパッチでは
004167: 10 00
とADRESS部分が6文字なのですが?
エデッターでどう入れればいいのでしょうか
エデッターって何ですか?
int main(void) {
FILE *fp;
fp = fopen("hoge", "w+b");
fseek(fp, 0x4167, SEEK_SET);
fwrite("\x10\x00", 2, 1, fp);
fclose(fp);
return 0;
}
可変個の引数を取る関数の中で、与えられた引数の個数以上に読むのはまずいですけど、
少なく読むのはかまわないですよね?
yes
超怒素人です。
@のexeで取得した変数アドレスを
Aのexeから入力して変数の値を取得したいのですがうまくできません。
何故でしょうか?
@---------------------------------
#include<stdio.h>
int main(void)
{
int a;
long *pnt;
printf("数値を入力して下さい:");
scanf("%d",&a);
pnt = &a;
printf("変数のアドレス:%d\n",pnt);
printf("そのアドレスに格納されている値:%d\n",*pnt);
}
A---------------------------------
#include<stdio.h>
int main(void)
{
int a;
long *pnt;
printf("変数のアドレスを入力して下さい:");
scanf("%d",&a);
pnt = a;
printf("そのアドレスに格納されている値:%d\n",*pnt);
}
ポインタ変数の値が別プロセスで有効な保証は無い、というかまず無効
どうしよう...共有メモリとかの概念とか
物理アドレスと仮想アドレスとかの概念を教えた方がいいのだろうか...
そもそも何がしたいんだろう・・・
ありがとうございました。
"39"という文字列を39という値にしろということだと思うけど・・・
atoi、strtol、sscanf
アドレスを手動で入力させるのってかなり無理がある。
1バイトならsscanfだと面倒か・・・intの変数に入れた後にcharの変数に入れ直さなければならないから。
fscanf(fp, "%2d", &inum);
は、いくらなんでも冗談として、
1の質問は指示した人間にするべきかと。
余りに一般的で汎用的な言葉だけに、
その相手がどんなつもりで「パック」と言ってるかわからん。
#尤も、「おまえそんなこともわからないのか」と言われる覚悟が必要だけど。
ありがとうございました。
成績処理プログラムの作り方を教えてください。できれば具体的に
プログラムを書いてくださるとありがたいです。
#include <stdlib.h>
int main(int argc, char **argv);
void getSeisekiData(void);
void calcHyouka(void);
void putKekka(void);
int
main(int argc, char **argv)
{
getSeisekiData();
calcHyouka();
putKekka();
return EXIT_SUCCESS;
}
/* それぞれの処理をこの後に書けば完成w */
サソ
ご回答ありがdです。
話しおわらさんといてや
int ENZAN (FILE *fp,char x,char y )
{
char z;
x&=0x0F;
x<<=4;
y&=0x0F;
z=x | y;
fwrite(&z, sizeof(z),1,fp );
}
↑こんな感じの処理をパックって
言うもんだと思ってました・・・
もっと詳しく説明してくれ。
昔にも、それBCDちゃうみたいなこといわれて、
調べ直したことがあったんだけど、
結局、どう解釈が違っているのかわからんかったんで。
>>565
ありがとうございます。
二桁で8bit、それに符号4bit、併せて12bit。
違うかな。
=562
1バイトにパックってことだから、符合は考慮しないんでないの?
#寡聞にして、符号付BCDの実例を知らないんだけど。
/* 取り敢えず、こんなもんでどうでしょ。 */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char**argv);
int
main(int argc, char **argv)
{
int count[256];
int ch;
while (ch = getc() != EOF) {
count[ch]++;
}
/* 問題は出力方法 */
return EXIT_SUCCESS;
}
配列の0での初期化は?
GUIアプリケーションをLinuxで開発したいと思うんですが、
どんなライブラリを使えばいいんでしょうか?
どれがお勧めのライブラリなんでしょうか?
を読んでないだろ。
スマソ。別スレに逝きます・・・
出力方法はこんなんでどうでしょ。
for (i = 0; i < 256; i++) {
if (isprint(i)) {
printf("%c: %d", i, count[i]);
}
}
改行しないと醜いかと。
今ユーザー関数作成で困っております。
仕様:テキストファイルを読み込み
行数毎に異なった処理を行い
バッファにぶちこむ。
for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++)
上記のようにすれば行数は数えることが
可能ですよね?
int cntに代入された数値を利用し
switch (cnt){
case 1:
printf("(゚д゚)ウマー\n");
break;
case 2:
printf("(・A・)イクナイ\n");
break;
といった感じにしたのですが
cntを関数に引数で渡すにはどのように
すればよろしいのでしょうか?
初心者でご迷惑お掛けいたしますが
ご教授お願いいたします。
関数の定義の仕方がわからんということか?
void uma(int cnt) {
switch (cnt){
case 1:
printf("(゚д゚)ウマー\n");
break;
case 2:
printf("(・A・)イクナイ\n");
break;
}
}
とか定義しといて
for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++) {
uma(cnt);
}
でいいんじゃないの。それともこういうことじゃない?
さん
ありがとーございます!
なるほど、こうやって定義するんですねぇ。
勉強になります。
cntが1だったら
(゚д゚)ウマーが出力されるのか。
すげー。関数すげー。
関数(゚д゚)ウマー
forを
for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++)
という形で使えるやつが、
な ん で 関 数 定 義 が わ か ら な い ん だ ? !
for は極めたが関数定義はまだ習っていないか理解が不十分。
で充分説明つくじゃないか。
BASICからCに入ったので、(自分で定義する)関数というものを知らなかったに100ペリカ
したがって、mainはおまじないで、main以外の関数は一切なし。
しかもgotoを多用したスパゲッティプログラムだ!
Cから始めたけど、2000行程度なら関数はmainだけにするYO!
逝ってよし。
そんな義理なし。
義理チョコしかもらえないんですか
義理チョコももらえませんが何か?
。・゚・(ノД`)・゚・。
int main(){
//略
return 0;
}
この最後に返してる0ってなんに使うの?
子プロセスとしてプログラム動かしたら
wait(&state)とかでstateに入る数値になるの?
( ゜Д゜)ポカーン・・・
__
l⊆⊇`ヽ ≡ ヤホー----イ
(´ァョLノ ≡
m=○=mノ) ≡ もうスレ立ってた気がしる〜
_/_/(「_ノニコ ≡
( (0)=(__)0) ≡(´⌒(´⌒;;
スレ立てたのなら現行スレに報告しろよ
それは立てた香具師に言ってくれ
sss
=6
おまえのチェックミスを棚に上げんな
禿同。はアフォ。早く削除依頼しなさい。
=10
自作自演でした。テヘッ
自作自演でした。
見ればわかります
void func(char **);
main()
{
char a[100][100];
func(a);
return 0;
}
void func(char **a)
{
}
↑のようにやったらプログラムが暴走したんですが
対処法はいかに?
void func(char a[][100])
PHP
int a = 4.3;
abs(3.5);
とかのミスってlintで検出できますか?
まあ、当然のことですけど
C++
C言語の感覚で書かれたC++はクソコード
誰もそんなことは聞いていない。
C++はオブジェクト指向なのになんでCが応用できるのかと小一時間(略
逆にCに応用できる言語は何ですか?
awk
C++
C++言語の感覚で書かれたCはクソコード
誰もそんなことは聞いていない。
結局、CとC++は、繰り返しや比較などが同じなだけであって
設計方法は全然違うわけだな。
ありがとう。でもそこに書いてあることをほとんど
やってくれなかった。
質問!!
C言語ってDVDなどにあるプロテクトもC言語に一種ですか?
教えてください
Cでsnprintfを自作することになりました。
参考になる資料とかありましたら教えてください。
フリーで使えるソースが何処かに落ちていると良いのですが。
VC++ならCRT\SRCフォルダに。
レスどうもです。
VC++見てみたのですが、うーん難しい事してるんですね。
FILEポインタの中身なんて、いじった事無いです。
これprintf系で汎用的に使う為にこんな感じで実装してるのかなー?
そのまま使いたいところだけど、多分ライセンスで引っかかりそう・・・
マルチいくない!
つーか、なんで...
> Cでsnprintfを自作することになりました。
なんてことやってんの ?
win上でgccを使っているのですが、
*.libのファイルを*.oなんかに変換できますか?
別に *.lib のままでいいのでは?
何か不都合でもあるのん?
お答えありがとうございます。
ファイルフォーマットが認識されない、といわれたので。
単に対応していないだけなのでしょうね。
まあ、至急必要なものでもないですし。。。
あ、すまん。
*.a じゃなくて *.lib か。
なるほど。
分離ってできたっけかな...。
win 上の gcc とは何者で、その *.lib はどっから持ってきたものかを書けよ。
これからC言語を始めてみようという初心者です。
LSI CってのをDLしてみたんですが、使い方がよく分かりません。
参考書買ってみたんですが動かし方については詳しく載ってませんでした。
どなたか詳しく教えていただけませんか?
lsc ファイル名
以上
ごめん、うそ>46
lcc ファイル名
lcc.exeにちゃんとパスを通すこと
あと、_lccも自分の環境に合わせて編集すること
あとは、read.me読めば書いてるよ
えっと・・・
まだよくわからないんですが、
MS-DOSを開きますよね。
lcc filename
しますよね。
次は何をすれば動きますか?
エラーメッセージが出なければ、もう何もしなくていい。
やりかたは分かったんですが、
コマンドまたはファイル名が正しくありません
とでます。
どうすればいいですか?
しつこくてすいません。。。
MS-DOSのコマンドラインから
SET PATH=%PATH%***
と入力して
lcc filename
としてみてください。***の部分はパス名(C:\...\LCC\BIN;)です。
ちなみにBINはBINARY(二進)の略で実行可能ファイルが入ったフォルダの
名前として常識です。わかりましたか?
51ですが追伸です。参考になればいいのですが、_lccファイルです。
# LSI C-86 compiler's configuration file
-DLSI_C
-XC:\LSIC330C\BIN -LC:\LSIC330C\LIB -IC:\LSIC330C\INCLUDE -T -O
-acdos.obj $LSICOPTS
?Command line argument will be inserted here
-lknjlib -ldoslib -v
うぜぇ
Cそのものとは関係ねえ事書くな
∧ ∧___ ダッコ♪
/(*゚ー゚) /\
/| ̄∪∪ ̄|\/
| |/
 ̄ ̄ ̄ ̄
大人しくしていなさい。
セグメンテーション違反ですってなんですか?
変なとこに書き込んだりしたときに良く出る。
どこが間違ってるのかさっぱりわからんです...
変なとこをかいたりしたときに良く出る。
セグメンテーション違反は一番良く見るバグだと思うので、
頑張って間違った箇所を探しませう。
・配列の添え字が変な位置を指しているかどうか
・ポインタの扱いが間違っているかどうか
の2箇所を重点的に調べましょう。
それはコアダンプ。
ありがとうございます。
がんばって探してみます。
卒論間に合うか不安。。。
・・・デバッガ使えよ・・・
!?そ..それはいったい....?
emacsとかについてるやつですか?
gdbとか
emacs見てみたらgdbなるものを発見いたしました!
しかし英語表記のため使いかたがいまいちわからぬ。
調べてみます。。。
memsetでdouble型の配列の値を全てdouble x;
にすることはできますか?
できない。
了解!!
デバッガという言葉も知らない奴が卒論までにgdbを使えるわけがない。
デバッガgdbの簡単な使い方。
まずプログラム作成 hoge.c
#include <stdio.h>
main(){
int *a = NULL;
*a = 0;
}
コンパイル時に -g オプションをつける
gcc -g -o hoge hoge.c
実行プログラムをgdbの引数に指定
gdb hoge
gdbのプロンプトが出たらrunを実行
(gdb) run
フォールトエラーなどが出たら、理由と場所を教えてくれる。
Program received signal SIGSEGV, Segmentation fault.
0x8048468 in main () at hoge.c:5
5 *a = 0;
終了するときはquit
(gdb) quit
初歩的な質問で申し訳ない。
ファイルからコンソール画面に一行一行読み込んで表示するという、
超基本的なプログラムを書いてみました。
そこで質問なのですが、今のままでは、改行は何も表示されない空白で表されますよね。
この改行部分に「----ここは改行です-----」といったメッセージを表示したいのですが、
どうすればいんでしょう?とりあえず自分が書いたものを↓に。
#include <stdio.h>
void main(){
FILE *fp;
char a[20];
fp = fopen("text.txt" ,"r");
do{
if (fgets(a ,20 ,fp) == NULL){
printf("//////終わりです//////\n" );
break;
}else{
if (a == ""){ ★★★問題の箇所です
printf("-----ここは改行です-----");
printf("%s\n" ,a);
}else
printf("%s\n" ,a);
}
}while(1);
fclose(fp);
return;
}
if(a=="") を if(*a=='\0') に変更すればいいのでは?
まず、fgets() って読み込んだ改行をそのまま a[] に入れちゃうから、
printf("%s\n", a) なんてやると、一行毎に空行が入るけどいいの ?
あと、要件として行が改行のみなら、"----ここは改行です-----" と表示すると言うのなら、でいいけど、「何も表示されない空白」の代わりに"----ここは改行です-----" と表示すると言うなら、ちょっと難しいぞ。
if (strlen(a))
a[strlen(a) - 1] = '\0';
ってのを付け加えた方がいいかも。
if (strcmp(a, "\n") == 0)
にすればええんでない?
まぁ簡単に
if (a[0] == '\n')
でもいいか。
あとは
・改行の場合はわざわざ a を表示しようとする必要は無い
・do-while じゃなくて、while 内で fgets を使ったので構わない。
・fp が NULL かどうかのチェックは入れる癖をつけておくが吉。
・最後の行にのみ改行が無い場合があることを考慮するべし。
ってとこでしょうか。
#include <stdio.h>
int main()
{
FILE *fp = fopen("text.txt", "r");
char a[20];
while (fgets(a, 20, fp) != NULL) {
if (a[0]=='\n')
printf("-----ここは改行です-----\n");
else
printf(a);
}
printf("//////終わりです//////\n" );
fclose(fp);
return 0;
}
printf(a); と printf("%s", a); は違う。
> printf("%s", a)
漏れは fputs(a, stdout) のが好きだ。
72です!皆さんのご指摘でうまく動くようになりました。
質問の箇所だけではなく、他の様々な部分まで指摘してもらって、感謝してます。
判定文ごとwhileの中に入れろとか、さんの19文字ジャストでおかしくなる・・・とかの話は、
読みながらハタと手を打ってしまいました。
速度面で有利とか、エラーでにくいとか、そういったことが何かあるんですかね?
単に好みの問題でしょうか。
速度は大抵fputsのほうが速いだろう。
必ずじゃないけど。
教えてください!
return (
x1 >= x2+width2 || x1+width1 <= x2 ||
y1 >= y2+height2 || y1+height1 <= y2
) ? false : true;
ってどういうことですか??
if(x1 >= x2 + width2) return false;
if(x1 + width1 <= x2) return false;
if(y1 >= y2 + height2) return false;
if(y1 + height1 <= y2) return false;
return true;
と同じだよ。多分2つの領域の重なり判定と思う。
ふむふむ
確かゲーム系で、当たり判定のところっぽい関数だったからそうなのかも!
「||」って、「OR」だったと思うのですが、三項演算子って順々に判定してfalseやtureを返すんですか?
なんか質問部分がわかりにくいーー・・・
> 三項演算子って順々に判定してfalseやtureを返すんですか?
三項演算子 xxx ? yyy : zzz は、単に xxx の値の真/偽によって yyy か zzz を返すだけ。
順々に判定するのは、|| (論理 OR 演算子) の方。
xxx || yyy は、xxx が真なら yyy を実行しないで 真 を返す。
(短絡演算で、ググッてくれ。)
ありがとう!ググってきましたー。なるほど。よくわかりました
お世話になりました!
Cで書いたプログラムなんですが、コンパイルは通るのに実行するとエラーが起こります。
デバッグ(と呼んでいいのかどうか分かりませんが)したいのですが、
どのように行うのでしょうか。
コンパイラはgccをMS-DOS上(MinGW)で使っています。