C言語なら俺に聞け(入門編)Part 63at TECH
C言語なら俺に聞け(入門編)Part 63 - 暇つぶし2ch464:デフォルトの名無しさん
10/04/26 11:01:21
いや寧ろ、ここは>351みたいに捻くれた初級者向きじゃない。
いっそ小心者スレ辺りでやってほしい。

465:デフォルトの名無しさん
10/04/26 13:02:05
>>464
お前が童貞専用自慰スレに行けばいい

466:デフォルトの名無しさん
10/04/26 22:05:24
フローチャート記号の「準備」ってどうやって使うものなの?
変数の宣言というのがこういうので、この時に使う?↓
int nurupo;
これは「処理」でいいよね?↓
int nurupo = 1

467:デフォルトの名無しさん
10/04/26 22:14:54
int nurupo = 1
が準備だな

処理に備えて初期化という準備をしているわけだし
変数宣言はフローチャートの中では書かないことが多い

468:デフォルトの名無しさん
10/04/26 22:52:29
会社で初期化と同時に代入書いたら
「こんな書き方見たことない、直せ!」と言われた。

469:デフォルトの名無しさん
10/04/26 23:02:07
初期化と同時に代入ってどうやるんだ

470:デフォルトの名無しさん
10/04/26 23:02:55
int i;
int j = i = 0;

こういうやつか
まあキモいな

471:デフォルトの名無しさん
10/04/26 23:03:11
>>469
語弊があって申し訳ないが、>>467みたいなやつ。

472:デフォルトの名無しさん
10/04/26 23:06:20
「初期化」と「代入」を勉強し直させるべきだな
つーか見たことない、って

473:デフォルトの名無しさん
10/04/26 23:08:35
宣言と同時に代入ってことか?

474:デフォルトの名無しさん
10/04/26 23:10:00
>>466
ソース読めば瞬間わかることを書いてはいけない
よく読まなければわからないことをアシストしてこそ意味がある

475:デフォルトの名無しさん
10/04/26 23:11:39
>>473
それを初期化と言う
まあ、初期化は代入ではないがな

476:デフォルトの名無しさん
10/04/26 23:26:20
初期化は代入じゃない?
int main(void) {int x = 5; return 0; }
なんかだと代入じゃない?

477:デフォルトの名無しさん
10/04/26 23:34:34
いいえ、初期化です

478:デフォルトの名無しさん
10/04/26 23:41:51
466だけど、アホ言ったみたいでほんとごめん。
もう少しグーグル先生で探してくる。プログラムって難しそうね。。
>>474
そういうものなのね。
じゃあ殆どつかわねーよ!という記号もあるとか?

479:デフォルトの名無しさん
10/04/26 23:46:14
auto 変数に初期化なんかあるのか?全部代入じゃないのか?
それとも俺の頭が古いのか?

480:デフォルトの名無しさん
10/04/26 23:58:19
>>479
古いんじゃなくて、最初からちゃんとした文法を覚えていないだけ。

481:デフォルトの名無しさん
10/04/27 00:01:05
>>480
static な変数に対する初期化は理解できるが、auto な変数に初期化という動作はあるのか

main() {
int x; /* 宣言 */
x = 1; /* 代入 */
}

をひとつにまとめものが
main()

482:デフォルトの名無しさん
10/04/27 00:01:46
int main() {
int x = 1; /* 宣言&初期化 */
}
と思っていたのだが。

483:デフォルトの名無しさん
10/04/27 00:03:31
ごめんなさい。やりなおし。
main()
{
int x; /* 宣言 */
x = 1 /* 代入 */
}
をひとつにまとめたものが
main()
{
int x = 1 /* 宣言+代入 */
}
だと思っていたのだが、規格はこれを初期化と呼んでいるのか?

484:デフォルトの名無しさん
10/04/27 00:11:39
>483

それは、初期化子付きの宣言。あくまでも宣言で、宣言+代入ではない。
式と宣言では文法が区別されている。

int a[] = {1, 2, 3,};
と書けるが
int a[10];
a[] = {1, 2, 3,};
とは書けないのは別物だから。

485:デフォルトの名無しさん
10/04/27 00:16:06
>>483
JIS X3010 6.7.8 初期化

486:デフォルトの名無しさん
10/04/27 01:11:59
>>481
途中で送信したとは思ったがシュール過ぎて笑った。

487:デフォルトの名無しさん
10/04/27 11:47:43
制御系プログラミングの初歩として、C言語(++ではない)のビット演算を勉強しています。
unsigned char型の変数を、二進数でバラして8個の0/1フラグとして使うための一番効率のよいやり方って何ですか?
一般的に使われるロジックとしては以下のメソッドのような感じでOKですか?

//引数srcのnビット目を0か1かで取り出す
unsigned char getNbit(unsigned char src,unsigned char n)
{
//srcと2のn乗(nビット目だけ1の値)と論理乗算して、0になったら0を返す。そうでなければ1。
if( src & (1<<n) == 0 )
{
return 0;
}
else
{
return 1;
}
}

//引数srcのnビット目に指定の値param(0/1)をセットした値を返す
unsigned char setNbit(unsigned char src,unsigned char n,unsigned char param)
{
//0をセットする場合、srcと2のn乗の値を反転した値(255-1<<n)とを、論理乗算する
if(param == 0)
{
return src & (255-1<<n);
}
//1をセットする場合、srcと2のn乗(1<<n)の値とを、論理加算する
else
{
return src | (1<<n);
}
}

488:デフォルトの名無しさん
10/04/27 11:54:37
ビットフィールドじゃあかんの?生成されるコードは汚いけど

489:デフォルトの名無しさん
10/04/27 11:58:10
二つ目はon/offで関数わけようぜ

490:デフォルトの名無しさん
10/04/27 12:00:41
IO操作するならビットフィールド使って、関数で隠蔽する

491:デフォルトの名無しさん
10/04/27 12:15:09
(255 - 1 << n) じゃなくて ~(1 << n)ってするのがビット演算らしい

492:デフォルトの名無しさん
10/04/27 12:34:18
__inline unsigned char getNbit(unsigned char src, unsigned char n) {
return src & (1 << n);
}

__inline unsigned char setNbit(unsigned char src, unsigned char n, unsigned char param) {
return src & ~(1 << n) | (!!param << n);
}

493:デフォルトの名無しさん
10/04/27 12:39:45
return (src >> n) & 1


494:487
10/04/27 13:33:20
皆さん、ありがとうございます。

>>490
まさにIO制御の学習です。
基盤にランプが8個乗っていて、指定のIOポート1つ(1バイト)に値をセットすることで点灯/消灯を制御するといった課題です。
ビットフィールドというのを調べてみます。

>>492
前者は、指定したビットが0のときは0が返るけれど、1のときは1<<nが返りますね。
それでも、このメソッドを使う際に、「0かそうでないか」という運用をすれば良いということですか?
JavaのbooleanやC#のbool型に慣れているゆえ、0か1かの戻り値にこだわらないといけないと思っていましたが、
Cの常識だとそうでもないという認識で良いですか?

後者は、「src & ~(1 << n) | (!!param << n);」の記述の意味を詳しく教えていただけると助かります。
「src & ~(1 << n)」の部分までは、「とりあえず指定ビットを0にする」というのは分かりますが、
その後、 !!とはどういう意味の記述なのでしょうか。

こういう短く基本的な処理を書くにはinlineにしたほうが高速なのですね。とても参考になります。

495:デフォルトの名無しさん
10/04/27 13:38:56
ビットフィールドの実装依存の部分からいってその用途には使えないんじゃないの?
パディングとか順番入れ替わるとかで

496:デフォルトの名無しさん
10/04/27 13:46:15
>>494
>>492の get の方は指摘の通りで、0, 1 に固定するなら(した方がいいだろうけど)、
return !!(src & (1 << n));
としてもいいが、それなら >>493 の方がいいね。

!! は ! を2回やってるだけ。 0なら0、0以外なら1にしたいときにやる常套手段。

497:デフォルトの名無しさん
10/04/27 14:15:09
>>487の判定文、演算子の優先順位をよく調べとけ


498:デフォルトの名無しさん
10/04/27 14:28:54
>>494
JavaでもC#でも0が偽というところは変わらんよ。
if (3)とかかけるでしょ

499:デフォルトの名無しさん
10/04/27 15:34:56
>>498

500:デフォルトの名無しさん
10/04/27 15:42:12
JARO

501:デフォルトの名無しさん
10/04/27 18:54:10
!!はキモいんだよなあ
好みの問題だろうけど
ちゃんと最適化されるかどうかは気になる

502:デフォルトの名無しさん
10/04/27 19:14:22
!!がいやなら!=0はどうよ?

503:デフォルトの名無しさん
10/04/27 19:20:04
>>485
なるほど、「静的記憶域区間」のみならず「自動記憶域区間」の場合であっても、初期化という言葉が適用されるのですね。
インプリメント上では単なる代入にすぎないものであっても。



504:デフォルトの名無しさん
10/04/27 19:53:57
C++で挫折してCに流れ着いてCの入門書読み終えたんですが、中級者になるために試したらためになる演習課題とかありませんか
たぶんメモ帳とか作る場合GUIとか使わないとならないんですよね?できたらヒント付きで教えてくれませんか?


505:デフォルトの名無しさん
10/04/27 19:54:16
>>502
俺は基本そうしてる
if文に直接書く時はそれすら書かないけど

506:デフォルトの名無しさん
10/04/27 19:55:02
>>504
CUIで作れるような簡単なゲームでも作るといいよ
俺はいつもヒットアンドブローを作るようにしている

507:デフォルトの名無しさん
10/04/27 22:01:56
構造体のメンバに順次アクセスする
ナイスな方法ってある?

508:デフォルトの名無しさん
10/04/27 22:10:36
char*でキャストして、1バイト毎に順次アクセスする

509:デフォルトの名無しさん
10/04/27 22:14:11
メンバの位置や型を配列にして保存しておいて
それでループでアクセス

まあ普通そんなことやるなでFAだが

510:デフォルトの名無しさん
10/04/28 15:43:35
>>507
unionを使うのが一番楽で上品

511:デフォルトの名無しさん
10/04/28 16:33:51
>>510
順次アクセスという言葉の意味がわかってないだろ
馬鹿は黙ってればいいのに

512:デフォルトの名無しさん
10/04/28 17:14:46
順次アクセスできない理由を教えてくれ天才

513:デフォルトの名無しさん
10/04/28 19:37:37
>>511
こういう感じでいけるっしょ。
typedef struct {
int a;
int b;
int c;
int d;
} hoge_t;

typedef union {
hoge_t u;
int l[4];
} chinko_t;

514:デフォルトの名無しさん
10/04/28 19:38:41
あ、int l[0] にしといた方が便利がいいな。

515:デフォルトの名無しさん
10/04/28 20:07:29
アラインメントが気になる
同じ型ならまず問題は無いだろうが、万が一があるしな

516:デフォルトの名無しさん
10/04/28 20:14:52
メリット皆無だし。

517:デフォルトの名無しさん
10/04/28 20:16:54
>>515
それを言い出したらそもそもunionの存在そのものが怖いよな。

>>516
誰もメリットの話なんかしてねーだろ

518:デフォルトの名無しさん
10/04/28 20:26:35
添え字でアクセスしたいだけなら
#define STFX(N,V) switch(N){case 0:struct.a=V;break;case 1:~}
で十分だし。

519:デフォルトの名無しさん
10/04/28 21:01:43
おいおい今日もまたCの連中はつまんねえことでもめてるよww

520:デフォルトの名無しさん
10/04/28 21:10:53
>>519
だよな、時代はD言語だろうに老頭児なC厨はオナニーでもしてろってのw

521:デフォルトの名無しさん
10/04/28 21:12:26
これだからC厨は・・・

522:デフォルトの名無しさん
10/04/28 21:12:59
D(笑)

523:デフォルトの名無しさん
10/04/28 21:14:18
おじいさまがたはFORTRANでも使っててください

524:デフォルトの名無しさん
10/04/28 21:14:28
老頭児って中国語か

525:デフォルトの名無しさん
10/04/28 21:18:30
おじいさまがたは LISP でも使ってください、
ん?

526:デフォルトの名無しさん
10/04/28 21:24:39
>>523,525
すまん、俺まだ20代だが両方とも会社で使ってるw

527:デフォルトの名無しさん
10/04/28 21:32:21
LISPは未だに超強力だからな。まあWindowsアプリに限って言うならC#の時代が来るかもしれない。囲い込みだしな
でもプログラムはWindowsアプリだけじゃないし、つーかDって誰が普及させるんだよw
世界中で使われてるCの牙城を崩す気ねーだろ
あとWebプログラミングのLLはこれからも生き残る

528:デフォルトの名無しさん
10/04/28 21:35:21
LISPはemacsとかあるからまぁ使う機会はそこそこあるかもしれんが
FORTRANを使う場面はまったく思い浮かばん
昔大学で実験に使って以来やってないから、もう文法もわがんね

529:デフォルトの名無しさん
10/04/28 21:49:20
順次アクセスとかそんなイレギュラーな使い方は普通しないし。

530:デフォルトの名無しさん
10/04/28 22:02:10
Fortranは大学ではまだつかってるところあるけど
Lispってemacsのマクロくらいしかないよ

って書こうとしてリロードして>>528を読んだ
たぶんほとんど同じものを見たのに出した答えが真逆で面白いなと思った

531:デフォルトの名無しさん
10/04/28 22:25:40
構造体の入れ子ってあまりよくないことなんでしょうか?(設計に問題あり?)


532:デフォルトの名無しさん
10/04/28 22:27:57
別に普通

533:ノラ
10/04/28 23:55:51
いま学校の課題で
do-while文を使って
1+2+3・・・というように数値を加算して表示し、
加算結果が300を超えたら表示して
処理を終了するというプログラムを組みたいのですが、
普段から授業ついていけなくて、よくわかりません
どなたか教えてください。お願いします

534:デフォルトの名無しさん
10/04/28 23:57:45
>>533
ここは入門スレなのであまり高度なことはお答えできません。

535:ノラ
10/04/29 00:00:38
>>534
どうしたらいいですか?

536:デフォルトの名無しさん
10/04/29 00:02:05
中学校の課題?

537:ノラ
10/04/29 00:03:53
>>536
いえ専門なんですが
全く授業についていけなくてですね・・・

538:デフォルトの名無しさん
10/04/29 00:03:56
>>535
スレリンク(tech板)

こちらへどうぞ

539:デフォルトの名無しさん
10/04/29 00:04:27
#include <stdio.h>

int
main(void)
{
  int i = 1;
  int sum = 0;

  do {
    sum += i++;
  } while (sum < 300);
  printf("%d\n", sum);

  return 0;
}


540:デフォルトの名無しさん
10/04/29 00:04:29
そういうときは美味しいカレーのレシピを書いて提出だろう

541:ノラ
10/04/29 00:12:06
>>539様ありがとうございます。
参考にしてがんばってみます

542:ノラ
10/04/29 00:14:24
>>539
sum入れないでもできますか?

543:デフォルトの名無しさん
10/04/29 00:16:16
ついていく気は無いようだwww

544:デフォルトの名無しさん
10/04/29 00:24:11
>>542 自分でやれよカス

545:デフォルトの名無しさん
10/04/29 00:52:38
>>542
#include <stdio.h>

int
main(void)
{
int i = 1;
do {
printf("%d\n", i * (i + 1) / 2);
i++;
} while (i * (i + 1) <= 600);
return 0;
}


546:デフォルトの名無しさん
10/04/29 00:55:13
>>542
結果を格納しておく変数が必要なわけ。
加算していって、それをどこに保持しておくの?って話になるでしょ?

だから、この場合は「sum」っていうy変数に入れてる。
別にgoukeiでもsでも、C言語の規則に従ってればなんでもいい。

547:デフォルトの名無しさん
10/04/29 00:55:55
>>545
綺麗だけど初心者には分かりづらいソースだなwwwwwwwwww

548:デフォルトの名無しさん
10/04/29 01:03:48
まて、少なくとも綺麗ではない

549:デフォルトの名無しさん
10/04/29 01:16:39
この手の問題は、答えが分かるのなら質問しない。つまり初めから論外なレベル
宿題スレじゃないんだからさ

550:デフォルトの名無しさん
10/04/29 02:39:15
ちょっと質問なんですけど。。。
Raw Socketってあるぢゃないですか?
私の開発環境はWindowsでVC++ 2008なので
Winsock2を使ってws2_32.libをリンクし、
socket(AF_INET,SOCK_RAW,IPPROTO_IP);
こうやって書くんだと思うんですが(違ったらまた勉強してきます)、
IPヘッダを作成するときにIPを偽装できるという記事を
拝見したことがあります。

その場合、IPというのは何のIPなのでしょうか?
プライベートIPですか?
グローバルIPですか?

仮にグローバルIPを返られるとした場合、
例えば携帯IPに変更することは可能なのですか?

もし可能なら大変なことになるのでそれは出来ないと思うのですが、
出来たとしたら掲示板などはどのような対策を施すのでしょうか?

■以下、板違い発言すみません。
私はC言語のほかにPerlやPHPなどCGIで掲示板などを作成してます。
もし上記に書いたようなグローバルIPを偽装するような行為があったとしたら
どのように防げばいいかわかりません・・・
できればそんなこと出来ないものだと願いたいものです。。。

551:デフォルトの名無しさん
10/04/29 06:42:02
>>550
スレチとか死ねよゴミ野郎

IPの偽装は現在は無理
一言でいうとヘッダに書いてあったIPに本当にそいつが送ってきたのか確認するから

それとグローバルIPですかプライベートIPですか?って質問も相当アホ



552:デフォルトの名無しさん
10/04/29 09:19:03
グローバルだよ (LAN内にサーバもあるならローカルでもいいけど)

携帯のふりもできるよ 掲示板は対策要らないよ
あんたの掲示板はTCPだろうから>>551が言うようにそのIPに対して問い合わせするわけだから
偽装された他人に問い合わせしても返事来ないでしょ

UDPで動く(昔のネットゲームとか?)ものなら がんばって通信内容もまねれば 
他人がゲームやってるときにちょっかい出せるかもしれんけど

553:デフォルトの名無しさん
10/04/29 15:12:39
すみません、矩形画像出したくて以下のを書いてみたんですが画像が表示されません。
誰かお願いします。

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

int main(void)
{
char fi[50];
float buff[128*128];
int nx = 128, ny = 128;
int i, j;
FILE *fp;

// 画像の初期化
for (i = 0 ; i < nx*ny ; i++)
buff[i] = 0;



554:デフォルトの名無しさん
10/04/29 15:14:47
// 矩形画像の作成
for (i = 32 ; i <= 96 ; i++) {
for(j = 32 ; j <= 96 ; j++) {
buff[i*nx+j] = 100;
}
}

// 画像の書き出し
printf( "Input new file name: " );
scanf( "%s", fi );
if ((fp = fopen ( fi, "wb")) == NULL) {
printf("Error: file open [%s].\n", fi);
exit (1);
}
fwrite(buff, sizeof(float), 128*128, fp);
fclose (fp);
}


555:デフォルトの名無しさん
10/04/29 15:22:34
どこそこがおかしいと言うレベルじゃなくめちゃくちゃなんだが
お前それ本とかみてやってそうなのか?

556:デフォルトの名無しさん
10/04/29 15:28:34
>>553
画像ヘッダをつけるかフォーマット指定してビューワに読み込ませれば表示できるかもしれない
ACDSEE とかそういうの

float 型の画像ってことはCTスキャンデータかな?
後輩だったりしてw

557:デフォルトの名無しさん
10/04/29 15:29:11
ウィンドウに絵を表示したいの?それとも画像ファイルを出力したいの?
前者ならまずウィンドウを作成しないと。
後者なら出力したい画像フォーマットに従ってデータを出力しないとダメだよ。

558:デフォルトの名無しさん
10/04/29 15:46:14
>>557
とりあえず raw形式でいいんじゃない?

559:デフォルトの名無しさん
10/04/29 16:11:29
釣りにつられたようだ

560:デフォルトの名無しさん
10/04/29 16:37:32
>float 型の画像ってことはCTスキャンデータかな?

先輩、今時CTのデータが128ってことはないでしょ 
ネマコードもないし DICOM形式でもない

561:デフォルトの名無しさん
10/04/30 09:51:52
ヘリカルスキャンCTの場合で、512x512x200くらいは平気でありそうだ。
つーか、float生データでも適切なツールを使えば表示はできるだろうけどね。
いずれにしても、Cの話じゃなく画像フォーマットの話というか仕様の解釈の話だ。

562:デフォルトの名無しさん
10/04/30 10:53:29
ヘリカルCTなら512x512x320くらいデフォだけど
型はshortだな

563:デフォルトの名無しさん
10/04/30 11:15:48
結局文型が業界にたくさん入ってきて保身に全力だからじゃないの?
あいつら技術的なこと分からないから技術持ってるベテランにいてもらうと邪魔なんだよ。
そいうやつらが外注管理とか客先交渉とかの技術的なこと分からなくてもできる仕事を創出してこの業界で生き残れるシステムを作ったんじゃないだろうか。
技術のない正社員はすぐ首にできるシステムになってないのがいけないんだと思うんだ。
だいたい技術職なのに技術にこだわってるやつを軽蔑する空気があるのはおかしいと思う。

564:デフォルトの名無しさん
10/04/30 11:18:53
誰かが言った、偉大なる素人集団だと。

565:デフォルトの名無しさん
10/04/30 12:00:27
そういう時、アメリカなら技術者だけが出て行って別会社を作る
たとえばintelの技術者が「もっとすごいCPUを作りたい」といって、独立して作った会社がAMD

ただし営業力がなくて負ける

566:デフォルトの名無しさん
10/04/30 13:33:12
でもさ、反論を覚悟で書くけど

技術が高くてもメシは食えないんだよね
でも営業が小ざかしいくらい上手いと技術がクソでも売れる
メインな部分どっかに丸投げでもOK 
宣伝の上手い声の大きいやつが勝つ


あと、技術持ってないやつが上にいたりすると楽だよね
「あ、それ2週間はかかります」とかどう考えても5分で終わる仕事でも平気でそんな事いってみたり
ある程度技術があるようならバレバレでもさ
(「そんなことしてるお前がクソなんだよ」って言われちゃうだろうな)

567:デフォルトの名無しさん
10/04/30 13:35:19
お前らマ板に帰れよ

568:デフォルトの名無しさん
10/04/30 13:39:55
>>566
上が技術だとある意味もっと楽だぞ。
こっちの話がちゃんと伝わるから、更に上にリソースの確保をきちんと交渉してくれる。
尤も、弊社の場合No.2まで技術系だから突っ込まれたときはやばいw

569:デフォルトの名無しさん
10/04/30 13:40:35
いい加減巣に帰れよ

570:デフォルトの名無しさん
10/04/30 13:41:26
>>569
スレ違いの雑談と言う意味ではあんたも同罪。

で、Cの初歩的な質問未だ?w

571:デフォルトの名無しさん
10/04/30 13:43:10
reallocって失敗したら元のデータはどこかへ消えてしまうんですか?
そのあたりがよくわかりません

572:デフォルトの名無しさん
10/04/30 14:07:53
>>571
お前にわかる必要など無い

573:デフォルトの名無しさん
10/04/30 14:09:40
>>571
宇宙の法則がみだれるからな・・・

574:デフォルトの名無しさん
10/04/30 14:54:33
>>571
大丈夫。realloc()はメモリ確保に成功しない限り元の領域は解放しない。
つまり、使う側が間抜けでない限りどこにも消えはしない。

575:デフォルトの名無しさん
10/04/30 15:10:13
>>574
回答ありがとうございます
reallocに与えるアドレスをとっておいて、reallocがNULLを返したらそっちを取り扱えばいいってことですね

とはいえ今まで一度もmalloc系が失敗するとこをみたことないんですけどね

576:デフォルトの名無しさん
10/04/30 15:57:46
>>575
いつ失敗するんだろうと思って延々mallocをしてみるのが普通のマ。

577:デフォルトの名無しさん
10/04/30 15:59:32
まぁ確かに。標準設定のままのLinuxだと楽観的メモリ管理を採用しているから
以上に大きな値を指定しない限り、メモリが足りようと足りなかろうとNULLは返さないからね。

で、実際に使おうとしたときに足りなくなるとプロセス落として知らん顔w

578:デフォルトの名無しさん
10/04/30 16:09:09
カーネルパラメータいじる前にメモリを増設します

579:デフォルトの名無しさん
10/04/30 16:12:07
じゃあ俺は64bitLinuxにしてかつスワップもりもりにする

580:デフォルトの名無しさん
10/04/30 16:17:50
Linuxのソースを改造してメモリ管理を改善させます。

581:デフォルトの名無しさん
10/04/30 16:20:17
なにを改善するんだろ。楽観的メモリ管理をやめるために改造するはずはないし

582:デフォルトの名無しさん
10/04/30 16:24:21
楽観的メモリ管理をやめたいだけなら設定変更するだけじゃなかったっけ?
まぁ、Linux板向けの話だね。

583:デフォルトの名無しさん
10/04/30 18:39:33
/proc/sys/vm/overcommit_memory

584:側近中の側近 ◆0351148456
10/04/30 19:19:45
>>575
(っ´▽`)っ いや、異常終了にしたほうがいいんじゃね?
alloc系がエラー返すって相当やばいから、処理続行するのは危険だね。

585:デフォルトの名無しさん
10/04/30 20:19:21
reallocしたい場面にもかかわらず、reallocに失敗しても続行できる場面が想像しがたいけど、
続行できるのなら続行してもいいと思うよ。
ほんとに必要な場面で失敗したなら異常終了で。

586:デフォルトの名無しさん
10/04/30 20:23:22
そういう場面では、キャッシュとして確保しっぱなしのメモリを開放とかじゃないかなあ・・・

587:デフォルトの名無しさん
10/04/30 21:20:56
つか、実際そういう時って
固まっちゃって動かなくて、引き続き他の動作もクソもないよな

588:デフォルトの名無しさん
10/04/30 21:44:01
Hello, world!
の出力を21byteで思いつける天才いる・・・?
code golfです。

URLリンク(golf.shinh.org)

589:デフォルトの名無しさん
10/04/30 21:48:52
なんでgorubyがあってHQ9はないんだろうな

590:588
10/04/30 21:53:43
あ~・・・
C言語ね・・・

591:デフォルトの名無しさん
10/04/30 22:04:09
>>588
#include使ったチート技じゃないかい?

592:側近中の側近 ◆0351148456
10/04/30 22:05:45
>>588
(っ´▽`)っ
#error Hello, world!

593:デフォルトの名無しさん
10/04/30 22:16:04
側近ってこんなところにも来るんだ・・・
今日のアキバにしか存在できないと思ってた

594:デフォルトの名無しさん
10/04/30 22:16:23
>>592
側近死ね

595:デフォルトの名無しさん
10/04/30 22:17:24
安価同じw

596:デフォルトの名無しさん
10/04/30 22:30:57
側近マジ死ねよ消えてくれ。ウザい。

597:デフォルトの名無しさん
10/05/01 01:29:47
int *cp = (int *)calloc(50, sizeof(int));
int *p[5][10];
for(int i = 0; i < 5; i++){
for(int j = 0; j < 10; j++){
p[i][j] = cp++;
}
}

*cpのデータは外部モジュールから受け取る2次元の情報で縦、横のサイズは決まっている。
ここではとりあえずcallocで代入。
2次元として加工したいのでポインタの二次元配列を宣言して「それぞれの要素にポインタを代入していく」。

「それぞれの要素にポインタを代入していく」操作が結構まどろっこしいように思えるのですが、もう少しスマートな方法はありますか?

598:デフォルトの名無しさん
10/05/01 01:44:25
>>588
まったく思いつかない。
どうやったんだ?

599:デフォルトの名無しさん
10/05/01 01:55:46
すみません、質問させてください
問題の箇所以外ははしょってますが

#define LINE_BUF 1024

main(){

int i;
int num;
char rf[LINE_BUF];

scanf("%d", &num);
fflush(stdin);

fgets(rf, LINE_BUF, stdin);



}
-------

残っている改行文字をfflushして、
次のfgetsにいきたいのですが、fgetsがそのまま飛んでしまいます

改行文字が入力ストリームに残っている、という状態なのかと思いますが
まずいと思われる箇所を指摘していただけると幸いです

600:デフォルトの名無しさん
10/05/01 01:59:41
>>599
コンパイラによっては使えることもあるけど
fflush(stdin);
は未定義動作

601:デフォルトの名無しさん
10/05/01 02:01:25
>>599
scanf("%d", &num);
fflush(stdin);

fgets(rf, LINE_BUF, stdin);
sscanf(rf, "%d", &num);

602:デフォルトの名無しさん
10/05/01 02:03:13
なるほど、ありがとうございます
fflush関係のページをいろいろ見てみます
夜分遅くに、早いレス大変助かりました

603:デフォルトの名無しさん
10/05/01 02:04:14
調べてわからなければ聞くようにしろよ

604:デフォルトの名無しさん
10/05/01 02:06:58
>>601
これまた申し訳ございません
なるほど、こちらは一旦文字列をクッションに使う感じですね
こちらも後で試してみます
ありがとうございました

605:デフォルトの名無しさん
10/05/01 02:21:37
>>603
fflush(stdin)

setbuf(stdin, NULL)
と変更することでちゃんと動いてくれました

>>601
こちらの方法でも無事確認出来ました

お二人ともどうもありがとうございました

606:デフォルトの名無しさん
10/05/01 02:37:00
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

上のテキストファイル(年別の平均気温などのデータ)の2列目のデータの小さいほうから順番に並べかえて、ファイルに出力するプログラムを作りたいのですがうまくいきません。
コンパイルは通るのですが、うまく作動しません
どこが違うんでしょうか?
なんかソートの部分がうまくいってない気がするのですが、よくわかりません
よろしくお願いします

607:デフォルトの名無しさん
10/05/01 03:48:20
nが2重に使われているのと

for( n=0 ; n < number ; n++ ){
for( j=n+1 ; n < number ; j++ ){
の2行目はj < numberかと

608:デフォルトの名無しさん
10/05/01 03:54:48
for( n=0 ; n < number ; n++ ){
// for( j=n+1 ; n < number ; j++ ){
for( j=n+1 ; j < number ; j++ ){

// for( n=0 ; n < number ; n++ ){
for( j=0 ; j < number ; j++ ){

609:607
10/05/01 04:01:49
ああ、見直してみたらnは2重になってなかったや。。
整形せずに見たらごらんの有様だよ

610:デフォルトの名無しさん
10/05/01 04:21:21
It's eight tabs.

611:側近中の側近 ◆0351148456
10/05/01 07:30:02
>>597
(っ´▽`)っ

for(int i = 0; i < 5; i++){
for(int j = 0; j < 10; j++){
p[i][j] = cp++;
}
}

の部分が、

memcpy(p, cp, sizeof(p));

でいけそうだが。どうだろう?

612:側近中の側近 ◆0351148456
10/05/01 07:35:27
(っ´▽`)っ
メモリ上の表現がpとcpで同じってところがポイントな。
どちらも、sizeof(int *)*50 バイト分、連続した領域が確保されている。

613:デフォルトの名無しさん
10/05/01 07:40:54
何を代入してるかわかってない

614:側近中の側近 ◆0351148456
10/05/01 07:42:16
(っ´▽`)っ
cpとcを同じ共用体で定義すれば、コピーが不要になる。
union U
{
  int *cp;
  int *c[5][10];
};

615:側近中の側近 ◆0351148456
10/05/01 07:46:23
>>613
(っ´▽`)っ cpは実体の配列、cは各々のポインタの配列だったか・・・。
しにたい

616:側近中の側近 ◆0351148456
10/05/01 07:55:51
>>614
(っ´▽`)っ ダブルポインターにしないとね☆

union U
{
  int **cp;
  int *c[5][10];
};

617:デフォルトの名無しさん
10/05/01 10:18:19
NG Name:側近中の側近 ◆0351148456

618:デフォルトの名無しさん
10/05/01 10:20:22
ID出ないからコテなのはありがたいねw

619:梓川水乃 ◆0351148456
10/05/01 12:57:35
>>618
(っ´▽`)っ そうだね☆

620:デフォルトの名無しさん
10/05/01 13:18:54
URLリンク(codepad.org)
URLリンク(codepad.org)
URLリンク(codepad.org)
単純過ぎるくらい単純にしないと当方バカなので3日後に読めないのです


621:606
10/05/01 15:07:07
指摘された部分を直したらファイルは出力されるようになったのですが、出力されたデータが
00000000000000000000000000000000000000みたいな感じになっちゃってます

622:デフォルトの名無しさん
10/05/01 15:20:23
ちゃんと>>608の指摘した2箇所を直したか?
後半のはfprintfのループのところだぞ?

623:597
10/05/01 15:28:27
>>616
それだと2重ポインタの方が0x00000000のままなので、
渡されるデータの位置アドレスと、配列の先頭アドレスとで共用してくれません。

私の例ではポインタの2次元配列にしていますが、2次元配列(ポインタではない)の先頭アドレス=渡されるデータの位置アドレス
となればそれが一番いいのですけど…

int hairetu[5][10];
int **p = hairetu;
これの逆バージョン…

int *p = (int *)0x********;
int a;
&a = p;
無茶ぶりですが配列無しでいえばこんな動作…やっぱり無理な気がしてきました。

624:606
10/05/01 15:39:59
>>622
一つだけnがjに変わってませんでした
確認不足でした
無事に出力することができました
ありがとうございます

625:デフォルトの名無しさん
10/05/01 15:50:06
>>623
やりたいことがいまいちわからない

こういうことかな?

union tag_hoge_t
{
int cp[50];
int c[5][10];
}hoge_t;

int *p=(int*)0x********;
hoge_t *q=(hoge_t*)p;

q->cp[10]==q->c[1][0];

============================================================
それともこうかな?

int *cp=(int*)0x********;
int (*c)[10]=(int*[10])cp;

c[1][1]==cp[11];

626:デフォルトの名無しさん
10/05/01 16:03:45
>>625
訂正
int (*c)[10]=(int(*)[10])cp;

627:597
10/05/01 16:20:26
>>625
ズバリそれです!!どちらでも理想の動作でした!
共用体のポインタもできるんですね。
後者は仕組みがよくわからないのでもう少し考えてみます。
後者の方がスマートで見た目がわかりやすいのでそちらを利用したいと思います。
以下に自分のやりたいことの完成形を載せておきます。
ありがとうございました!


union tag_hoge_t
{
int c[5][10];
};

int *p=(int*)0x********;
tag_hoge_t *q=(tag_hoge_t*)p;

if(q->c[1][0] == 10)…

============================================================

int *p=(int*)0x********;
int (*c)[5][10]=(int (*)[5][10])p;

if((*c)[1][0] == 10)…

628:597
10/05/01 16:25:34
>>627
後者はポインタの配列ではなく、配列のポインタになっているんですね
勉強になりました!

629:デフォルトの名無しさん
10/05/01 20:30:06
IMG 02691 JPG
URLリンク(www.seikei.or.jp)
私たちが当院の言語聴覚士です 宜しくお願いします
URLリンク(www.yushinkai.jp)
言語聴覚士を目指す高梨さん
URLリンク(www19.atpages.jp)
理学療法士 作業療法士 言語聴覚士
URLリンク(www.ims.gr.jp)


630:デフォルトの名無しさん
10/05/02 11:54:32
マクロ機能って標準Cに含まれるんですか?

631:デフォルトの名無しさん
10/05/02 12:22:15
当然

632:デフォルトの名無しさん
10/05/02 13:13:26
#include <stdio.h>

int main(void)
{
int a, b;

printf("キーボードから数値を入力してください");
printf("数値1を入力してください:"); scanf("%d", &a);
printf("数値2を入力してください:"); scanf("%d", &b);


printf("10割る3は、%d余り%dです。\n", a / b, a % b);

return (0);

}

8行目が違うっぽいんだけど、なんで?

633:デフォルトの名無しさん
10/05/02 13:14:39
全角スペース

634:デフォルトの名無しさん
10/05/02 13:15:19
printf("数値1を入力してください:"); scanf("%d", &a);
scanfの前が全角スペースになってる

635:デフォルトの名無しさん
10/05/02 13:16:13
>printf("10割る3は、%d余り%dです。\n", a / b, a % b);
printf("%d割る%dは、%d余り%dです。\n", a, b, a / b, a % b);

636:デフォルトの名無しさん
10/05/02 13:20:22
>>633-635
ありがとう!

637:デフォルトの名無しさん
10/05/02 14:23:17
文字型の変数を初期化する時に、本のサンプルコードには

char ch = '\0'

って書いてあるんだけど、この\0ってエスケープシーケンスの「\xxx:8進数でxxxの文字コードを持つ文字」って解釈で良いんですかね?
xxxだから数字が3文字(例えばnullを表す場合は\000のように)じゃなきゃいけないと思ってたんだけど、
上の例みたいに数字1文字で表せる場合は省略しちゃっても良いんですか?

638:デフォルトの名無しさん
10/05/02 14:51:10
君は最初から最後まで間違っている

639:637
10/05/02 14:52:17
え・・・・何が間違っているのか指摘して頂けると助かるのですが・・・・

640:デフォルトの名無しさん
10/05/02 15:04:43
'\000' で問題ないと思うけど、'\xxx'でも'\xx' '\x'でも。

641:637
10/05/02 15:06:31
ああなるほど理解できました。ありがとうございました。
xxxっていうのは要するに一般化された時の便宜で3文字表記になってただけなんですね。

642:デフォルトの名無しさん
10/05/02 15:07:38
なんで'\0'より先にエスケープシーケンスがどうこう言ってるんだろう

643:デフォルトの名無しさん
10/05/02 15:12:58
たぶんさ 彼はポインタをNULLにしたがてる所と間違ってるとも生んだけど
厳密には\0とNULLはちげーよって言うエライ方のお話はとりあえず置いておいて

644:637
10/05/02 15:15:50
>>642
このような表記のされ方で、既に読んだ部分に書いてある知識がエスケープシーケンスしかなかったのです・・・
本は結構親切な部類に入るんですけど、文字型変数を初期化する時の'\0'っていきなり出てきたので混乱してますorz
エスケープシーケンスじゃないんですか?

645:デフォルトの名無しさん
10/05/02 15:19:47
'\0'なんて機械的にそういうもんだと覚えるほうが多いと思うんだが。

646:デフォルトの名無しさん
10/05/02 17:58:39
>>644
\で始まる表記なので、エスケープシーケンスという解釈であってるよ。

647:デフォルトの名無しさん
10/05/02 20:13:31
>>646
だね

648:デフォルトの名無しさん
10/05/02 22:53:36
ダブルクォーテーションの出力ってどうすればいいのでしょう?
printf(""""); こんなことやっても出てこないので泣きそうです・・・

649:デフォルトの名無しさん
10/05/02 22:55:06
>>648
"\"\""

650:デフォルトの名無しさん
10/05/02 22:55:21
\"

651:デフォルトの名無しさん
10/05/02 22:57:00
>>649
ありがとうございます!!

652:デフォルトの名無しさん
10/05/02 23:49:47
646で思いっきりエスケーなんちゃらの話しがでてるのに
いきなりprintfでダブルコーテションどうやんの?とか釣りだろ

653:デフォルトの名無しさん
10/05/02 23:54:14
>>652
頭の悪い奴だよなw

654:デフォルトの名無しさん
10/05/03 00:05:58
おれも似たようなこと聞いて良い??

行が長いときの行末に置く¥あるじゃないですか
行末は良いんだけど、数行になると、そこ数行だけ行頭から始まるのが嫌なんだけど
あれをインデントしても良い方法ってないすか?先生方よろしくお願いします

655:デフォルトの名無しさん
10/05/03 00:07:31
文字列の話です

656:デフォルトの名無しさん
10/05/03 00:11:45
>>654
一旦ダブルクォートを閉じればいい

char foo[]="ABC"
"DEFG"
"H";

657:デフォルトの名無しさん
10/05/03 00:44:22
ほんとうだ、先生ありがとう 

658:デフォルトの名無しさん
10/05/03 02:10:09
どういたしまして

659:デフォルトの名無しさん
10/05/03 16:19:16
C言語により記述された次の関数fがある。ここで、display()は
画面に1個の文字Aを書く手続きであるとする。
int f(int x){
display();
if(x==0)return 1;
if(x==1)return 3;
if(x==2)return 5;
return(f(x-1)+f(x-2)+f(x-3));
}
いま、f(x)を呼び出したとき、値105が返された。このf(x)が呼び出されてから
値を返すまでの間に、文字Aは画面にいくつ書かれたか。
1.43 2.44 3.45 4.46 5.47

すみませんが、このプログラムを文章に言い換えてもらえないでしょうか?

660:デフォルトの名無しさん
10/05/03 17:05:34
我輩はfである


661:デフォルトの名無しさん
10/05/03 17:10:58
>>659
下記の二式 f(x) および g(x) が与えられている

f(x)=f(x-1)+f(x-2)+f(x-3)
f(0)=1
f(1)=3
f(2)=5

g(x)=1+g(x-1)+g(x-2)+g(x-3)
g(0)=g(1)=g(2)=1

f(x)=105 であるとき g(x) はいくらになるか?

662:デフォルトの名無しさん
10/05/03 17:15:21
x>3の時、f(x)=f(x-1)+f(x-2)+f(x-3)
x<=3の時、
f(0)=1
f(1)=3
f(2)=5

だな

663:デフォルトの名無しさん
10/05/03 17:27:36
>>662
x≧3とx<3

664:デフォルトの名無しさん
10/05/03 18:08:57
宿題は宿題スレへ

665:デフォルトの名無しさん
10/05/03 19:51:51
「負の値が入力されるまで繰り返す」ってどうやるんだっけ?

666:デフォルトの名無しさん
10/05/03 19:54:47
入力値が0以上っていうのを継続条件にしましょう

667:デフォルトの名無しさん
10/05/03 19:55:47
なんで「どうやるんだっけ?」ってまるで以前は知ってたみたいな風に聞くの?

668:デフォルトの名無しさん
10/05/03 19:58:06
そういう設定なんです

669:デフォルトの名無しさん
10/05/03 19:58:32
痴呆症なんだろう

670:デフォルトの名無しさん
10/05/03 20:08:58
敵のスタンド攻撃で忘れちゃうんです

671:デフォルトの名無しさん
10/05/03 20:10:25
>>661>>662>>663
ありがとうございます

ところで
>g(x)=1+g(x-1)+g(x-2)+g(x-3)
>g(0)=g(1)=g(2)=1
はどこから出てきたんでしょうか?

672:デフォルトの名無しさん
10/05/03 20:13:12
f(x)一回につき文字を一個表示してるところからだろw

673:デフォルトの名無しさん
10/05/03 21:25:43
g(x) は表示回数を返す関数を定義してるだけ

x=0,1,2 の時は 1回書いて 抜ける: g(0)=g(1)=g(2)=1
それ以外では 1回書いた後、

674:デフォルトの名無しさん
10/05/03 21:26:58
途中送信してしまったが… (上略)
あとはわかるな

675:デフォルトの名無しさん
10/05/03 23:19:16
ポインタのサイズは4バイトの固定というのを見た事があるのですが、
64bitの場合でも同じですか?

676:デフォルトの名無しさん
10/05/03 23:21:17
別に固定じゃない

677:デフォルトの名無しさん
10/05/03 23:22:28
はい

678:デフォルトの名無しさん
10/05/03 23:51:34
見た事はすべて忘れろ

679:デフォルトの名無しさん
10/05/04 00:05:48
この環境のこのコンパイラは4バイト固定です、みたいな所読んだんだろ
それはそれで忘れちゃダメだろ

680:デフォルトの名無しさん
10/05/04 00:14:20
intが16ビットの環境だとポインタも2バイトだったの?

681:デフォルトの名無しさん
10/05/04 00:15:45
>>675
8バイトだよ
main() {
printf("%u", sizeof(void*));
}

682:デフォルトの名無しさん
10/05/04 00:25:49
データーバスのビット数とアドレスバスのビット数が違う環境があってな
int 型は、おおよそデータバスのビット数にあわすことが多いが
ポインタは、おおよそアドレスバスのビット数にあわすことが多い

アドレスレジスタが単純に並ばない 変態的な環境もあったのさ:
16ビットレジスタx2 を使って 24ビット物理アドレス を指す。  

683:デフォルトの名無しさん
10/05/04 00:28:10
>>681
環境書かなきゃ全く意味無いよ

684:デフォルトの名無しさん
10/05/04 00:33:36
すぐ気付いたけどもういい

685:デフォルトの名無しさん
10/05/04 04:44:08
64ビット64ビットと偉そうに言ってるけどさ、
結局はいまだ1バイト8ビットじゃん。
そろそろ進化させないのか?
C言語の生まれたPDP-11でさえ10ビットあったのに。
俺に言わせりゃi7もPhenomも8ビットCPUだよ。
進歩してない。

686:675
10/05/04 08:15:31
>>681
thx

687:デフォルトの名無しさん
10/05/04 09:09:35
>>685
確かに1バイトは8ビットだけど、いまどきワード以外のデータを
使うなんて貧乏人だけだよ
C言語のcharとかshortとか互換性のためだけに残ってるけど
富豪は常にintですよ。0か1のフラグ変数にもint使いますよ
しかもILP64ですよ

688:デフォルトの名無しさん
10/05/04 10:11:45
×貧乏人だけ
○キャッシュ効率のことが頭にないバカだけ

689:デフォルトの名無しさん
10/05/04 11:11:28
命令増やしてキャッシュ潰してりゃ世話ないな

690:デフォルトの名無しさん
10/05/04 11:33:45
文字もintなのか
すげぇな

691:デフォルトの名無しさん
10/05/04 12:54:31
>>680
8086でMS-DOSの頃
16ビット(64KB)の範囲しか扱わないモードと1MBアクセスできるモードがあって
使い分けていた。今でもfarとかnearという残骸を見ることあるでしょ?

692:デフォルトの名無しさん
10/05/04 14:19:06
>>691
WIndows95の頃Morland-C++5.0を買ったんだが、えらくぶ厚い
マニュアルが数冊入っていて、今では考えられない位に8086のアーキテクチャ
を詳しく解説してあった

Windows3.1もまだまだ現役だった頃なので、STRICTを使ったプログラミング
も非常に克明に書いてあって、今読み返すと「ああこの頃はまだコンパイラ
メーカはやる気があったんだなあ」と思わせる

693:デフォルトの名無しさん
10/05/04 14:20:17
ああビール飲んでるからかtypoした

×Morland-C++
○Borland-C++

昼間から酒飲めるのは今日までか・・・orz

694:デフォルトの名無しさん
10/05/04 15:35:54
Cの文法的に下の書き方は正しいのでしょうか?

unsigned short Value;
Value = ((unsigned short)('AB'));

コンパイルされたアセンブリソースを見ると期待通りの結果になっているのですが、
移植等を考慮した場合、この書き方は避けるべきなのでしょうか?

movw ax,#04142H

分野は組込で、コンパイラはNECのものですが、エラーも警告もなしで通ります。
ググってみたものの、'A'については記述があるものの、期待する記述には出会えませんでした。

どうか、よろしくお願い申し上げます。

695:デフォルトの名無しさん
10/05/04 16:02:52
文法上は問題なし。 意味は処理系依存。


696:デフォルトの名無しさん
10/05/04 16:05:45
JIS X3010:2003 6.4.4.4 文字定数 より
2文字以上を含む(例えば 'ab')又は1バイトの実行文字で表現できない文字若しくは逆斜線表記を含む単純文字定数の値は, 処理系定義とする。

697:デフォルトの名無しさん
10/05/04 16:23:26
bccでやったら4241になったw

698:デフォルトの名無しさん
10/05/04 16:24:34
>>695-696
ありがとうございました。
時間があるときにJIS X3010:2003をよく読んでみます。

699:デフォルトの名無しさん
10/05/04 19:08:56
>>697
志村、エンディアン!エンディアン!

700:デフォルトの名無しさん
10/05/04 19:11:45
fgets関数について質問です。
この関数はEOFに達するとNULLを返すとのことですが、

FILE *fp;
char str[8];

while(fgets(str, 8, fp)){
printf("%s",str);
}

とやってファイルの内容を出力していった場合、最後はEOFが来てNULLが
返るので、最後のprintf1回が実行されないような気がするのですが、
そうではないようです・・・。それとも1文字ずつ判定してそのたびにprintfを
実行しているのでしょうか?


701:デフォルトの名無しさん
10/05/04 19:16:50
fgets内部の実装にもよるが、普通はバッファに一文字でも
書き込んだ状況でEOFが来てもフラグを設定するだけで
NULLは返さず次回の同じFILE*にたいする呼び出し時に
NULLを返す設計が取られるんじゃないかと...
(標準仕様でもそれが期待されているようだし)

702:デフォルトの名無しさん
10/05/04 19:21:52
>>700
ファイルの終端に達している状態でfgets()を呼ぶとEOFを返す

703:デフォルトの名無しさん
10/05/04 19:22:50
>>700
意味を勘違いしてる
最後の文字までとりこむfgetsではNULLを返さず
その次のfgetsでNULLを返すの

704:デフォルトの名無しさん
10/05/04 19:25:39
>>701 >>702 >>703
ありがとうございます!
なるほど理解できました。

705:デフォルトの名無しさん
10/05/04 22:42:34

質問です。

#include <stdio.h>
#include <string.h>
void main(void)
{
char name[5];
int len;
do{
printf("お名前を入力して下さい\t");
scanf("%s",name);
len = strlen(name);
} while(len>5);
printf("\nあなたのお名前は %s です。\n", name);

}

これでname[5]の配列に30文字くらい打ち込んで終了させると、
OSのほうから終了時にエラーが出されます。

メモリに打ち込んだ文字が残ってるからだと聞いたことがあるのですが、
これらの記録を消去して、エラーを出さないようにするにはどういうことをすればよいのでしょうか。

706:デフォルトの名無しさん
10/05/04 22:50:24
最初からname[200]くらいとっておく。
200以上入力しようとするやつは知らん

707:デフォルトの名無しさん
10/05/04 22:56:16
それか可変長だな・・・。

708:デフォルトの名無しさん
10/05/04 23:14:08
>>705
エラーがでるのはスタックに積んであるリターンアドレスをぶっこわしてるから

scanf("%4s",name);

とかやって、そもそも配列外にアクセスしないことが大事

709:デフォルトの名無しさん
10/05/06 12:16:27
>>706
その考えは身を滅ぼす。gets()を使うくらい、下策。
どうせscanf()を使っているのだから>708が妥当。

710:デフォルトの名無しさん
10/05/06 17:44:36
会社の研修の問題でもscanfは使わずにコーディングしなさい、だったぞ。

711:デフォルトの名無しさん
10/05/06 17:51:47
>>710
だからなんだってんだよ・・・・・・・・・・・・・

712:デフォルトの名無しさん
10/05/06 19:16:58
>>710
お前は何を言っているんだ

713:デフォルトの名無しさん
10/05/06 19:21:55
         /  ( ●)(●) |  

714:デフォルトの名無しさん
10/05/06 19:25:49
scanf は使わないのが常識だよ

715:デフォルトの名無しさん
10/05/06 19:28:23
printfも使わないのが常識

716:デフォルトの名無しさん
10/05/06 19:31:22
>>715
携帯開発部隊の方ですか?

717:デフォルトの名無しさん
10/05/06 19:31:35
scanf 使いたいときは sscanf を使うのが鉄則

718:705
10/05/06 21:19:16

バグ取れました。
次からはsscanfにすればいいのですね、ありがとうございました。

719:デフォルトの名無しさん
10/05/06 22:04:51
>>715
printfの戻り値を毎回確認してからしゃべれ、クソが

720:デフォルトの名無しさん
10/05/07 11:07:13
>>719
なにも考えずにつかっていたが、printfって戻り値があったのかw

721:デフォルトの名無しさん
10/05/07 11:48:44
そりゃ関数だし

722:デフォルトの名無しさん
10/05/07 11:51:02
voidだとおもってたわ。

723:デフォルトの名無しさん
10/05/08 00:42:00
質問します。

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

char *input(void){
int i; char aaa[8]; int count =0; char *bb="";
printf("番号入力する");
scanf("%07s",aaa);
fflush(stdin);
while (aaa[count]){
count++;
}
for (i=0;i<count;i++){
*(bb+i)=aaa[i];
}
return(bb);
}
int main (void){
int i; char *p;
i=atoi(input()); printf("%d\n",i);
p=input(); printf("%s\n",p);
return(0);
}

これで実行してみると、printf("%s\n",p);で表示される文字の5桁目だけ、数字が入力時から+1された状態になります。
何故このようなことが起きるのでしょうか。
正しい表示にするにはどうすればよいのでしょうか?

724:デフォルトの名無しさん
10/05/08 01:17:34
わぁお、char *bb="";*(bb+i)=aaa[i];
とんでもないことしてくれてるな

725:デフォルトの名無しさん
10/05/08 01:20:10
スーパースマートコーディング

726:デフォルトの名無しさん
10/05/08 01:21:04
それ以前に変数名を何とかしろよw

727:デフォルトの名無しさん
10/05/08 01:44:32
>>723
何をしたいプログラムなのかわからないが、差し当たりの問題点を指摘する。

char *bb=""; は、コンパイラによっては書き込み不可領域に配置される場合があり、
実行時に落ちる気場合がある。

また、"" のみで初期化した場合、確保される領域は 2 バイトであるため、バッファ
オーバーフローを起こす可能性がある。

これらを防ぐには、malloc() でメモリ領域を動的に確保するか、main() 側でバッファ
を用意して input() に渡し、そこに入力結果を書き込むようにする。

なお、malloc() を使用する場合は必ず呼び出し側 (こごては main()) で戻り値を
記憶し、入力結果が不要になった時点で free() すべき。

728:デフォルトの名無しさん
10/05/08 02:52:30
その他の指摘。
・fflush(stdin)は環境依存なので避けた方がいい。
・数値入力用関数を作る積もりなら戻り値は整数の方が使い易くないか?
・scanf()の書式指定で'0'なんてあったか? printf()系の書式指定とは互換性がないと思った方がいい。
・returnは関数じゃないから括弧はつけない方がいい。まぁ、どうしても括弧つけたいなら止めないが。
・ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される。意味的に等価なbb[i]を使うべき。
・演習目的なら止めないが、文字列のコピーは専用の標準関数を使うべき。

729:デフォルトの名無しさん
10/05/08 03:30:52
>>728
えっ
ってのが二つ三つ……

730:デフォルトの名無しさん
10/05/08 03:34:22
>>729
kwsk

731:デフォルトの名無しさん
10/05/08 04:18:26
えっ
ってのが全部なんだが……

>・fflush(stdin)
意図が分からないので書くべきコードでは無い

>・数値入力用関数
はてな

>・scanf()の書式指定で'0'なんてあったか?
あるといえばある

>書式指定とは互換性がない
何を今さら

>・returnは関数じゃない
何を今さら

>・ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される
大変なところに迷い込んでしまいましたね、読みやすさを重視して時には間接参照しましょう
スワップ関数はマクロですか、memcpy()ですか、汎用ポインタですか

>文字列のコピーは専用の標準関数を使うべき
文字列のコピーをしようとしたわけでは無いかもしれない

といってみるテスト

732:デフォルトの名無しさん
10/05/08 04:27:54
>>731
何か勘違いしているようだから一言。
>>・ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される
これは文字通り、*(p+i)と書かずにp[i]と書けということ。
厳格なコーディング規約ではこのほか、ポインタ演算も禁止される場合がある。

そうそう、scanf()の書式指定では'0'は特別な意味を持たないようだね。
単純に幅指定の一部と見做されるのかな。この辺りは仕様を読み直さないとなんとも言えない。

その他は趣旨が不明なので割愛。

733:デフォルトの名無しさん
10/05/08 09:28:17
>723

実行するとSegmentation faltでこけるよ。
色々おかしいところがありすぎて、何がしたいのかよくわかりません。

入力文字列を数値に変換したいように見えるが、atoi使ってイイなら
文字列をそのままつっこめばいいし、scanf使ってイイなら%d使えよ
という気がする。

ま、一番の問題は>724の指摘通り;
*(bb+i)=aaa[i];
だね。
bbは書き換え可能な有効な領域を指していない。

734:デフォルトの名無しさん
10/05/08 09:40:37
>732

「厳格なコーディング規約」ってのは何?

いずれにしても
・ポインタに対する単項の*演算子禁止
・ポインタ演算も禁止
っていうコーディング規約は賛同できない。

>これは文字通り、*(p+i)と書かずにp[i]と書けということ。
何が文字通りなのかわからんが、p[0]ではなく
*pと書くべきケースは、少なからずありますよ。

>ポインタ演算も禁止される場合がある。
揚げ足とるようですまないが、文法を厳格に解釈すれば、
p[i]は*(p + i)のシンタックスシュガーでしか無いので、これも禁止されるように
読めてしまう。こうなるとまともなコーディングは無理。

「厳格なコーディング規約」というからには、しょうもないつっこみを
受けないような、「厳格な」表現を使ってください。

735:デフォルトの名無しさん
10/05/08 09:42:36
>>734
知識不足は恥じゃないけどねぇ。
今出掛けるんで、あとで資料を提示するよ。

736:デフォルトの名無しさん
10/05/08 10:02:06
メモリ領域を確保したら動くようになりました。
ご指摘のとおり、数値文字のみを文字列型で入力させて
その文字列をメインで受け取る入力用関数を作れという演習目的の課題でした。
質問の仕方が悪くて混乱させてしまい、すみません。

ご指摘ありがとうございました。


737:デフォルトの名無しさん
10/05/08 10:12:45
宿題は宿題スレへ

738:デフォルトの名無しさん
10/05/08 12:43:57
読み込むテキストファイルには*.cと書いてあるのですが、
(仮引数で拾った文字列).cに置換する方法をご教授願えないでしょうか。
以下がソースです。
色々突っ込みどころがあると思いますが宜しくお願いします

#define LEN_MAX 256
int FileRewrite(char *proj_name)
{
FILE *fp;
char *search_p;
char replace_p;
char line_buff[LEN_MAX];
char tar_buff[LEN_MAX];
char rep_buff[LEN_MAX];
char source_name[LEN_MAX];

sprintf(source_name, "./%s/Source/%s.c", proj_name, proj_name);
if ((fp = fopen(source_name, "r+")) == NULL){
fprintf(stderr, "file open error...¥nexit status(-100)¥n");
exit(EXIT_FAILURE);
}
strcpy(tar_buff, "*.c");
while (fgets(line_buff, LEN_MAX, fp) != NULL) {
search_p = strstr(line_buff, tar_buff);
if (search_p != NULL) {
sprintf(rep_buff, "// %s.c¥n", proj_name);
rtn = fputs(rep_buff, search_p);
}
}
fclose(fp);
return (0);
}

739:デフォルトの名無しさん
10/05/08 12:57:08
>>738
ソースファイル内の *.c という文字列を全て置換するの?
ソースファイルのコメント中の *.c という文字列を全て置換するの?

740:デフォルトの名無しさん
10/05/08 13:02:17
>>739
ソースファイルのコメント中の *.c という文字列です。
紛らわしくて申し訳ないです。

*.cという文字列は読み込みファイルの中に1つしかないので全てでもアリだと思います。

741:デフォルトの名無しさん
10/05/08 15:16:52
>>734
ほい、一例を。
URLリンク(sec.ipa.go.jp)
こいつの14ページ目辺りにポインタ演算について書かれているよ。
但しこいつは、逆参照自体はNGとはしていないけれど。
まぁ少なくとも、糖衣構文を理由に双方を適合とはしないということは判ると思う。

742:デフォルトの名無しさん
10/05/08 15:29:10
>>740
Cでやるよりsedやawkでやった方が楽な気がするけど。
sed -e 's/\*\.c/proj.c/' source > destination
該当ファイルを検索する辺りから含めてシェルスクリプトで書けば管理も楽だろうし。

Cでやりたいなら、以下に注意。
--
・読み込みバッファと書き出しバッファの共有は無茶
仮令"r+"でオープンしても、読み込みと書き出しは混在できない。
1行読んだら読む前の場所まで巻き戻してから書けば書けなくはないが、
行の長さが長くなるので次の行(の先頭)を潰してしまう。
あれこれ気を遣うくらいなら、一旦別のファイルに書いた方がいい。
・「*.c」が含まれる行は本当にそのコメント形式だけなのか
例えば「// *.c (ここに重要なコメント)」のようになっていたら、
そのコメントを潰してしまうことになる。
そこに気を遣うくらいなら、「*.c」を置換するに留めるべき。
尚、置換処理自体はsprintf()で%*.*sを駆使すれば数行で書ける。

743:デフォルトの名無しさん
10/05/08 15:29:43
#include<stdio.h>
int main(void){printf("%[d]"[2+3-1])}
の計算cygwinでやったんですが、でてきません。
どこが間違ってるでしょう?
一〇進の計算です。4とでてきません
基礎すぎてすいません・・・

744:デフォルトの名無しさん
10/05/08 15:34:12
>>743
・コンパイルエラーが出る場合はエラーメッセージを貼りましょう。
・何か参考にした資料があるなら明記しましょう。

まぁ、突っ込みどころは山ほどあるけど正解を以下に。
--
#include <stdio.h>
int main()
{
printf("%d\n", 2 + 3 - 1);
return 0;
}
--
尚、空白・改行は適宜変更してもいいが、記号類は省略も追加もしないこと。

745:デフォルトの名無しさん
10/05/08 15:43:40
>>744
レスありがとうございます。
ですが
それでやってみたところ
chmod:missing operand after `755'
Try `chmod--help'' for more inormation.c
とでてきたんですが??
755ってなんですか?ずっと755がでるんですが

746:デフォルトの名無しさん
10/05/08 15:52:35
>>741
「ポインタに対する単項の*演算子禁止」なんて規約が存在する、
というのは嘘でしたってことでいいのね?

747:デフォルトの名無しさん
10/05/08 15:54:31
>>745
コマンドラインパラメータの不足
C言語関係なし
コンパイル方法(打ち込む文字)が間違ってる

748:デフォルトの名無しさん
10/05/08 15:56:26
>>745 いったい何を「やってみた」んだ?

749:デフォルトの名無しさん
10/05/08 15:59:58
>>745
エラーメッセージを貼るときはきちんと貼りましょう。
また、自分が何をやったらそうなったのか、必要ならコマンドラインのコピーも交えて説明しましょう。
まぁ、最早Cの問題じゃないことは>747の言う通り。
このまま続けたいならエスパースレへ。

750:デフォルトの名無しさん
10/05/08 16:00:40
やってみたとは、プログラムの実行です。
gcc(ファイル名>>744のソース)をするとerrorがでました。
コンパイルエラーというのはプログラムの中身にエラーがあるとき
出るのですよね?

751:デフォルトの名無しさん
10/05/08 16:02:28
chmodできないのはコンパイラか。
取り敢えず、コマンドラインを貼れないならソースファイル名を晒してみようか。

752:デフォルトの名無しさん
10/05/08 16:23:32
厳密に言うとコンパイラ本体じゃなくてコンパイラとリンカを呼び出すスクリプトがエラーを出してる
missing operandだからソースファイル名がちゃんと入力されていないか、
コンパイルエラーでオブジェクトが生成されなくてリンカの手前でエラーが出てるかだと思う

753:デフォルトの名無しさん
10/05/08 16:47:51
>>750
コンソールを全部引用しろよ
お前クラスの素人の場合、普通の人が想像もしないことを
やってるから、抜粋すると解決しない

だいたい勝手にchmodが動くわけないし、誰かの作ったMakefileを
流用してるとかで、どっかで起動してるんじゃねーの

754:734
10/05/08 18:37:34
>732 >741

参照資料を見たけどさ、
「ポインタへの整数の加減算は使用せず、確保した領域への参照・代入は[]を用いる
配列形式で行う。」
としか書かれていないよ。
ポインタ演算禁止とは書かれておらず、丁寧に
「ポインタの演算を行う場合には、ポインタの指す範囲に気を付ける。」
と書いてある。

技術用語には「厳格な」定義があるので、勝手にねじ曲げないように。
>728で挙げている、あなたの感覚はおおむね間違っていないが、
理由付けからは、根本的な理解の甘さがかいま見える。
そのせいで、色々つっこまれている。

今回引っかかった表現は
×「ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される。」
×「ポインタ演算も禁止される場合がある」


755:デフォルトの名無しさん
10/05/08 18:45:08
>750

すでにつっこみが入っているが、何をやっているのかさっぱりわからない。

>やってみたとは、プログラムの実行です。
>gcc(ファイル名>>744のソース)をするとerrorがでました。

2行目でやっていることはコンパイルであって、プログラムの実行では無いぞ。
コンパイル中にchmodが勝手に走るなんてことは無いと思うけど。

>コンパイルエラーというのはプログラムの中身にエラーがあるとき
>出るのですよね?
chmod:missing operand after `755'
Try `chmod--help'' for more inormation.c
これはコンパイルエラーではない。chmodのエラーで、引数が無い
という意味。なんでchmodが出てくるのか、想像できない。

コンソールをそのままコピペして貼り付けてみたら?
もっともCの問題ではないと思えるが。

756:デフォルトの名無しさん
10/05/08 19:42:10
>>755
すまん、弟に聞いたらできたよ。
gcc OOO.c

a.exe

で実行でできた、あなたが間違ってるとかじゃなかったから
ごめん。
また来るよ。


757:デフォルトの名無しさん
10/05/08 19:44:13
今人いるかな?質問させていただきます
char型の'1'をint型の1にしたいんですけど、テストしたら49になってしまう
どうやったらいいです?

758:デフォルトの名無しさん
10/05/08 19:45:17
48を引きます。

759:デフォルトの名無しさん
10/05/08 19:47:08
>>758
今VBでやってるんだが、
ほかのコンパイルでもそれで結果同じになるならいいんだがどうなんです?

760:デフォルトの名無しさん
10/05/08 19:47:49
コンパイラーでした間違えた

761:>>757
10/05/08 19:57:04
ちなみにキャスト代入でやった
while文で、ひとつずつchar型の数字をint型にしたいんだがどうすればいいんだorz

762:デフォルトの名無しさん
10/05/08 20:07:34
ここはC言語スレです。
VBの質問ならVBスレへどうぞ。

763:デフォルトの名無しさん
10/05/08 20:08:23
VBでC言語やってるんだ
誤解させてすまぬ

764:デフォルトの名無しさん
10/05/08 20:20:39
>>761を読む限りではこんな感じ

int i, n[ 5 ];
char s[] = "12345";
for( i = 0; i < 5; ++i )
n[ i ] = s[ i ] - '0';

765:デフォルトの名無しさん
10/05/08 20:22:44
>>764
ありがとうございます!
あとでやってみます

766:デフォルトの名無しさん
10/05/08 20:25:44
>>761
char型の数字をint型に
int intsuji = charsuji - 48;

while文で、ひとつずつひとつずつ
何をしたいの?

767:デフォルトの名無しさん
10/05/08 20:29:30
>>766
char型に入ってる数字を一文字ずつint型にいれるっていうことを
配列でやってるんでなんか簡単にまとめられないものかとおもって;

768:デフォルトの名無しさん
10/05/08 21:05:44
>>767
やりたいことを具体的に書いた方がいいよ。

769:デフォルトの名無しさん
10/05/08 21:34:22
>>768
そうですね、あんまつたわらないしよくなかったとおもいます
こんどからそうします;
>>764
そのやり方でできました。ありがとうございます。

770:デフォルトの名無しさん
10/05/08 22:39:41
#include <stdio.h>

int main(void)
{
printf( "%d - %X + %o = %d\n", 398, 1FB , 327 ,398-1FB+37 );

return 0;
}
これどこが間違ってますか?cygwinでこれを実行したら前のプログラミングがでました。
間違えたプログラミングだと実行したら前やった実行がそのまま出るっぽいです。



771:デフォルトの名無しさん
10/05/08 22:41:39
>>770
1FB じゃなくて 0x1FB じゃないの?

772:デフォルトの名無しさん
10/05/08 22:47:54
レス早い、本当助かる。
なぜ0xをつけるんですか??!??!

あと質問ですが何故int main()っているんですか?
printfだけじゃだめなんですか?ただの数値計算なんですが・・・


773:デフォルトの名無しさん
10/05/08 22:48:45
すげぇww
できたwww0xつけたらできた。涙出てきたわ。ほんまありがとう
また来るよ。

774:デフォルトの名無しさん
10/05/08 22:50:01
二度と来るな

775:デフォルトの名無しさん
10/05/08 23:23:23
ひでぇ・・・w
1FBって16進だろ
16進ってことを表すのが0x

c言語はint main()っていれなきゃいけない
これは関数だからc言語は関数型言語

776:デフォルトの名無しさん
10/05/08 23:24:37
>>775
手続き型言語じゃないの

777:デフォルトの名無しさん
10/05/08 23:42:42
最初よくわからなかったものが
わかるとなんでわからなかったのかわからなくなる

778:デフォルトの名無しさん
10/05/08 23:51:21
>>775
えっ

779:デフォルトの名無しさん
10/05/09 00:09:04
18禁ゲームからエロシーン削除して家庭用に移植というくだらない事、最初にやったアホがいると聞いて

780:デフォルトの名無しさん
10/05/09 00:10:49
C言語では、プログラムがどこから始まるか、ちゃんと書かなきゃいけないルール。それがmain()
C言語を発明した人がそう決めた。

ほかの言語だとファイルの先頭からいきなり始まるやつもあるし、そういうわけわかんないルールを
覚えるのも含めてプログラミングの勉強だから。

781:デフォルトの名無しさん
10/05/09 00:50:35
JavaやC#よりはマシだな

782:デフォルトの名無しさん
10/05/09 07:49:11
entry は結局日の目を見なかったね

783:デフォルトの名無しさん
10/05/09 12:11:22
mainってただの慣習じゃないの

784:デフォルトの名無しさん
10/05/09 12:21:32
>>783 ちがうよ。規格で定められている関数だよ。

785:デフォルトの名無しさん
10/05/09 12:38:36
え?そうなの?
じゃぁWinMain使うときはどういう扱いなの?

786:デフォルトの名無しさん
10/05/09 12:43:57
単なるコンパイラの独自拡張

787:デフォルトの名無しさん
10/05/09 12:56:59
>>785
規格ではフリースタンディング環境に分類される
OS はないことになっているので、あくまで利用者定義ライブラリという位置づけ

788:デフォルトの名無しさん
10/05/09 13:00:50
>>786,787
ありがとうございました


789:デフォルトの名無しさん
10/05/09 15:54:38
質問します。
#include <iostream>
using namespace std;
static char *plus(char *fp_c, char *fp_c2);

int main()
{ char buf[]="ab,cde,fghi",buf2[100];
char *fp_c,*fp_c2;

fp_c=buf;
fp_c2=buf;

fp_c2=fp_c2+2;
*fp_c2=0x00;
strcpy(buf2,fp_c);
cout << buf2 << '\n';

fp_c,fp_c2= plus(fp_c,fp_c2);

fp_c2=fp_c2+3;
*fp_c2=0x00;
strcpy(buf2,fp_c);
cout << buf2 << '\n';
return 0;}

char *plus(char *fp_c, char *fp_c2){
return fp_c2++; //1進める
return fp_c=fp_c2;}
関数plusの中でポインタを1進める物を作ろうとしたのですが
実行すると、関数の中に入ってないのか、先頭のポインタに戻っているのか
上手くいきません。上手く関数を使いポインタを進めるにはどうしたらよいのでしょう?

790:デフォルトの名無しさん
10/05/09 16:33:21
警告、いや、エラーも出ると思うが、また、お笑いコードを書くなよ
っていうかスレチ

791:デフォルトの名無しさん
10/05/09 21:45:19
皆さんの知恵をお貸しください

今度学校の授業でモジュラス10ウェイト3のC言語のソースを書くことになったのですが、どのように入力した
数値を使ってチェックコードを導くのか苦戦しています。

どのような方法で考えればいいか教えてください。

792:デフォルトの名無しさん
10/05/09 21:46:15
>>791 宿題スレ池。

793:デフォルトの名無しさん
10/05/09 22:31:02
日本語で

794:デフォルトの名無しさん
10/05/09 22:36:40
>>791
scanfで数値を取得して、後は粛々と計算で終了では?
何を苦戦しているのか全くわからない。

795:デフォルトの名無しさん
10/05/09 23:24:40
質問です。
すでに入力されている文字列"12345678"があるとして、 "1234"だけを表示させて後は表示させないにはどうすればよいのでしょうか。
%cで一つずつ表示しか思いつかなかったのですが、よい方法はありますか?

796:デフォルトの名無しさん
10/05/09 23:34:49
>>795
#include<stdio.h>

int main(void)
{
char buf[256]="12345678";

printf("%.4s", buf);
return 0;
}

797:デフォルトの名無しさん
10/05/09 23:34:54
printf("%.4s", "12345678");

798:デフォルトの名無しさん
10/05/09 23:35:08
5の部分を\0に書き換える

799:795
10/05/10 01:51:59
素早い回答有り難う御座いました。

800:デフォルトの名無しさん
10/05/10 02:29:34
Cの勉強初めて数日の者ですが質問です

#include<stdio.h>

main(){
char a,b;
scanf("%c",&a);
printf("%c",a);
scanf("%c",&b);
printf("%c",b);

return 0;
}

これを実効すると
一つ目の文字を入力した時点で終了してしまうのですが何故でしょうか?

801:デフォルトの名無しさん
10/05/10 02:35:40
コンピューターの機嫌が悪い

802:デフォルトの名無しさん
10/05/10 02:44:29
>>800
例えば、プログラムを実行して
1[改行]
と入力した場合、入力内容は
'1\n'
となる。
よって、2つめのscanf()が実行された時点で、未読込の文字'\n'があるので、
2つめのscanf()は、更なる入力を待たず b に '\n' を代入してすぐ返る。
よって一つ目の文字を入力した時点で終了してしまうように見える。

803:デフォルトの名無しさん
10/05/10 02:48:42
>>802
なるほど
納得しました
ありがとうございました

804:795
10/05/10 02:57:13
お早い回答ありがとうございました。

805:デフォルトの名無しさん
10/05/10 12:01:15
getchar()やscanf()のような文字単位処理関数と端末エミュレータの一行編集とが相性悪いんだよな。
その点だけはGUIの方が初心者には判り易いと思うんだが。
# 尤も、そこに辿り着くまでの長い道程がGUIの最大の欠点なわけで……

入門書ではscanf()やgetchar()を使わず、全部コマンドラインオプションでやる方がシンプルに説明できるんじゃないか?
# そうすると、今度はコマンドインタプリタの余計なお世話を回避することを学ばないとならなくはなるけれど。

806:デフォルトの名無しさん
10/05/10 14:07:23
>>805
コマンドラインオプション?
コマンドインタプリタ?

意味が通じてない。えらそうなこという前に正しい用語ぐらい覚えておけ。

807:デフォルトの名無しさん
10/05/10 14:47:07
>>806
コマンドライン引き数、コマンドラインインタプリタと言えばご満足?

808:デフォルトの名無しさん
10/05/10 14:48:53
つーか、>805が偉そうだと思えるほど、>806は自信の知識の足りなさを実感しているのだろうな。

809:デフォルトの名無しさん
10/05/10 15:01:20
えらそうな人は実際えらい

810:デフォルトの名無しさん
10/05/10 15:02:27
原始UIと入出力はプログラミングの基本だろ
それ無しでどうやって入門するんだよ

811:デフォルトの名無しさん
10/05/10 15:24:39
scanfなんて最初の勉強以外で使ったこと無いな

812:デフォルトの名無しさん
10/05/10 17:09:08
>>806 も少しうざいけど、
>>805 の発言こそ「えっ」なんだが。

813:JaneDoeの抽出って便利だな
10/05/10 17:15:50
なんで>729とか>731とか>778とか>812って、その「えっ」の内容を書かないんだろうな。
余程自信がないんだろうか。

814:デフォルトの名無しさん
10/05/10 17:40:16
>>813
書かなくても普通にわかるだろwwww
お前が書いた本人なの?添削して欲しいの?



815:デフォルトの名無しさん
10/05/10 18:05:54
>>805
まじで何が言いたいのかさっぱりわからん。

>>807
それならますます意味が通じなくなる。
国語の成績が最低だったことだけはわかる。

816:デフォルトの名無しさん
10/05/10 18:26:16
おれが訳してやろう

getchar()やscanf()ってコマンドラインから入力とかに素直に使えないよな
だから初心者はGUIのほうがいいんだろうけど、GUIはやりたいことやるまでのおまじないの解説とかが多いしな

いっそコマンドラインのやつはパラメータを全部引数にしちゃって渡すとかが入門にはいいかな
でも、それだと引数の解釈のところがめんどくなるだけか

みたいな話だと思う、要は、えらそうにアレにもこれにも文句つけてるけど特に建設的な意見はない人だ
国語の成績はよかったと思うよ、大した事言ってないのにえらそうにするやりかたとかさ
でも、人に説明とかは苦手(で、通じなくて相手を馬鹿にして非難)な人だろうな

817:デフォルトの名無しさん
10/05/10 18:49:06
>>816
翻訳ありがとー
彼の言ってる内容はわかったが、その内容に意味がないこともよくわかったわw

818:デフォルトの名無しさん
10/05/10 18:50:43
研修でscanf()の使用を禁じられていたので。

819:デフォルトの名無しさん
10/05/10 19:08:53
同じ言葉を2回続けるとニュアンスが正反対になるよ!ふしぎ!


はい
はいはい

820:デフォルトの名無しさん
10/05/10 19:19:05
>>815
それはお前が低脳だからだよ
高脳なら低脳の書いたよくわからん文でも理解できるが、
低脳はさっぱりわからんで終わり。
俺も低脳だから>>805はよく分らんがな
>>817
周りは普通脳以上は、やれやれ低脳にはこんなことまでしてやらないと理解できないのか
低脳は大変だな、これじゃ仕事でも手間かかるなだろな。

821:デフォルトの名無しさん
10/05/10 19:38:52
>>805 の言いたいことは解るけど、
「相性が悪い」という点に同意できないんだよ。

822:デフォルトの名無しさん
10/05/10 19:50:03
>>821
それはお前が低脳だからだよ

823:デフォルトの名無しさん
10/05/10 23:12:00
仕方ない。俺が >>805 を翻訳してやろう
-- 
 >>getchar()やscanf()のような文字単位処理関数と端末エミュレータの一行編集とが相性悪いんだよな。 

 getchar()とかscanf()のような標準入力からデータを受け取る関数は、
 echo offにしてないと出力と入力のechoが混ざって相性悪いんだよな。

 >>その点だけはGUIの方が初心者には判り易いと思うんだが。 
 >># 尤も、そこに辿り着くまでの長い道程がGUIの最大の欠点なわけで…… 

 その点GUIはそういうToLoveるが無いので初心者も安心。
 もっともGUIアプリを作るなんて、初心者には果てしなき道のりなわけで…… 

824:デフォルトの名無しさん
10/05/10 23:41:00
getchar()はいいだろ。
素直にストリームの動作のイメージを反映してるし。


825:デフォルトの名無しさん
10/05/11 00:05:25
問題は、行内編集ができるから一文字ずつ入力するのに向かないってことでしょ。
getchar()で一文字入力しようとして「なぜか先に進む」類の罠に嵌まる質問が後を絶たないからね。

826:デフォルトの名無しさん
10/05/11 01:35:25
だから、単におまえの望む動作になってないってだけで全然相性は悪くないだろ。
ついでに言うと、1行編集は端末エミュレーターの機能じゃねえよ。
無知をさらしてるってことに早く気付けよ。

827:デフォルトの名無しさん
10/05/11 02:08:52
ファイルを分割するプログラムで疑問に思った点があります
質問させていただきます

fseek(fp, 0, SEEK_END)
ftell(fp)

としてサイズを取得した場合
今の自分の目的としているものが 195768 バイトのファイルなので
値としても 195768 とでてきます
しかし、

fseek(fp, 0, SEEK_SET)
ftell(fp)

として見てみると、この値は 0 とでてきます
ファイルポインタを先頭に置いているときは、
ftellの結果は 1 と出てくるのが妥当ではないかと感じるのですが
(fseek(fp, 195768, SEEK_SET) と
 fseek(fp, 0, SEEK_END)
が一致するなら、データが 195769 個あるように思うため)
先頭、あるいは末尾がopenしたファイルのデータとは異なる
特殊なものになっているのでしょうか?

分かりにくいかと思いますが、上手く説明できず申し訳ないです

828:デフォルトの名無しさん
10/05/11 02:12:16
>>827 fseek(fp, 0, SEEK_END) のあとに fgetc(fp) してデータが取れるかな?

829:デフォルトの名無しさん
10/05/11 02:13:34
>>827
0バイトのファイルで考えてみて

830:デフォルトの名無しさん
10/05/11 02:14:18
>>827
char file[195768] に対する添え字と同じ。
fseek(fp, 0, SEEK_END) は &file[195768] ってこと。

831:デフォルトの名無しさん
10/05/11 02:15:19
うほ、なにやら沢山ありがとうございます
付けてもらったレスみて考えてみます
感謝

832:デフォルトの名無しさん
10/05/11 02:28:37
みなさまのおかげで修正したプログラムも無事動きました
ありがとうございます

833:デフォルトの名無しさん
10/05/11 02:39:06
>>827
> ファイルポインタを先頭に置いているときは、
> ftellの結果は 1 と出てくるのが妥当ではないかと感じるのですが

ファイルアドレスは 0 から始まるので、ファイルポインタが先頭、つまり
0 バイト目にある時は ftell() の結果は 0 と出るのが妥当です。
ファイルサイズ 0 の場合に fseek(fp, 0, SEEK_END) した時、ftell() が 1 を
返すのは妥当ではないと感じませんか?
ファイルサイズ 1 の場合に fseek(fp, 0, SEEK_END) した時、ftell() が 2 を
返すのは妥当ではないと感じませんか?

> fseek(fp, 195768, SEEK_SET) と
>  fseek(fp, 0, SEEK_END)
> が一致するなら、データが 195769 個あるように思うため)

いきなり 195768 のように大きなアドレスを扱うから混乱します。
まずファイルサイズ 0 の場合を考えてみてください。
fseek(fp, 0, SEEK_SET) ないし fseek(fp, 0, SEEK_END) をしてもファイル
ポインタは先頭、つまり 0 バイト目を指したままですが、そこに 1 個目の
データが存在すると思いますか?
いいえ、存在しません。

同様に、ファイルサイズ 195768 の場合、fseek(fp, 195768, SEEK_SET)
ないし fseek(fp, 0, SEEK_END) をしてもファイルポインタは 195768 バイト
目を指しますが、そこに 195769 個目のデータが存在すると思いますか?
ファイルサイズ 195768 なのに、最後の 1 バイトのデータはどこから来る
のでしょう?
いいえ、どこからも来ません。データは 195768 個しかありません。

ファイルポインタが指している場所に必ずしもデータが存在するとは限り
ません。

834:デフォルトの名無しさん
10/05/11 03:45:02
コンソールに計算式(例:34+4)を入力して演算結果を出力するプログラムを作っています。
作ってみたのですが、足し算しかうまくいきません。
どこが違ってるのかよくわからないのでアドバイスください。

URLリンク(kansai2channeler.hp.infoseek.co.jp)


835:デフォルトの名無しさん
10/05/11 04:07:50
>>834
if(p!=NULL){
b = atoi(p + 1);
printf("%d + %d = %d\n", a,b,a+b);
} else if(q!=NULL) {
c = atoi(q + 1);
printf("%d - %d = %d\n", a,c,a-c);
} else if(r!=NULL){
d = atoi(r + 1);
printf("%d * %d = %d\n", a,d,a*d);
} else if(s!=NULL){
e = atoi(s + 1);
printf("%d / %d = %d\n", a,e,a/e);
}

836:デフォルトの名無しさん
10/05/11 04:38:18
なんでb, c, d, eを分けてるの?
ch1, ch2, ch3, ch4は何の意味があるの?

837:デフォルトの名無しさん
10/05/11 12:15:32
>>834
それ以前に
文字列の初期化なし
入力妥当性チェックなし

838:デフォルトの名無しさん
10/05/11 12:29:04
>文字列の初期化なし
ってなんの話?

839:デフォルトの名無しさん
10/05/11 12:30:49
空の文字列入れるとか、memsetで埋めるとかしないと
何にも入ってない不定の状態での格納は危険じゃないかと。
あと、ch1~ch4に入れるときのキャストがなんか気持ち悪い。

840:デフォルトの名無しさん
10/05/11 12:37:33
>>839
>何にも入ってない不定の状態での格納は危険じゃないかと。
どんな危険があるのですか?


841:デフォルトの名無しさん
10/05/11 13:12:06
0でターミネートし忘れた場合とかぬかすんだろどうせw

842:デフォルトの名無しさん
10/05/11 14:29:03
至急!!!!

任意個数の整数を標準入力(キーボード)から入力し、
入力された整数の個数
平均値(小数点以下 1 桁まで表示)
最大値
最小値
を標準出力(ディスプレイ)に表示するプログラムがわかりません。


843:デフォルトの名無しさん
10/05/11 14:29:52
ただし、9999が入力されたら入力を終了するものとし、9999は入力個数、平均値、最
大値、最小値には含めない。
また、最初に9999が入力された場合には、入力個数=0、平均値=0.0、最大値=0、
最小値=0が出力されるようにする。


844:デフォルトの名無しさん
10/05/11 14:37:52
>>842
わかりました!!!!

845:デフォルトの名無しさん
10/05/11 14:55:29
>>834
NULLだろうけど変数が多いね。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
やりたいのはこういうこと?

846:デフォルトの名無しさん
10/05/11 15:01:03
>>842
まず、入力がなくなるまでループ
最初の1個目を最大値、最小値とみなす
2個目以降は最大、最小を調べる
合計値に順次足していってループ回数もメモっておく
ループ抜けたら最大値、最小値、平均値を出力しておわり

847:デフォルトの名無しさん
10/05/11 15:03:30
小数点一桁目まで出すのなら %.1f だっけ?

848:デフォルトの名無しさん
10/05/11 15:04:59
>>846
それができないから聞いてるんですけど・・・

849:デフォルトの名無しさん
10/05/11 15:27:07
>>484
なぜ出来ないか詳しく。
制限のためか、それともC言語を書けない為か?

850:デフォルトの名無しさん
10/05/11 15:35:03
ここまで書いたけど・・・とソース晒すとか、何がわからないのかを具体的・端的に説明するとかしない奴は
プログラムを自分で書く気はない。
宿題スレへ。

851:デフォルトの名無しさん
10/05/11 15:36:27
宿題スレどこ?w

852:デフォルトの名無しさん
10/05/11 15:48:34
死ぬがよい

853:デフォルトの名無しさん
10/05/11 16:44:46
課題で出たんですが
アルファベット1文字と整数型の数値 n を読み込んで,その文字の n 文字後の文字を表示するプログラムを書きなさい
とはどういうことでしょうか?アルファベットとは数値のことですか?全体的に問題の意味が
わからないんですが・・・

854:デフォルトの名無しさん
10/05/11 16:53:55
>>853
アルファベット1文字・・・A-Z a-z
整数型の数値n・・・0-99999999...

A + 0 = A
A + 1 = B
A + 2 = C ...

855:デフォルトの名無しさん
10/05/11 16:56:56
はぁ?アルファベットはアルファベットだろうが
つかCの話でもなんでもないじゃん

たとえば

a5 なら a から5番目→g
f3なら fから3番目→i
D1なら E ってことだろ

もらった文字に数字足して、zをこえるならAに残ったぶんを足すんじゃね?




856:デフォルトの名無しさん
10/05/11 16:59:21
a5 なら a から5番目→f だったwww
zまで行ったらAにもどるのめんどいなら
「そこに文字はないです」って言って再入力させるとか

857:デフォルトの名無しさん
10/05/11 17:40:08
うん?よくわかりません、アルファベットってのは数字に値するんですか?
どういう数え方ですか?アルファベットにアルファベットを足したら?
このプログラムの方法もよくわかりません。頭悪くてすいません・・・一応
今日も徹夜・・

858:デフォルトの名無しさん
10/05/11 17:49:22
>>857
アルファベットの文字コードのことなんだけどね。

char c = 'A';

という構文はわかる?
そして

c = c +1;
putchar(c);

とすると画面には B と表示されるんだけど・・・

859:デフォルトの名無しさん
10/05/11 18:03:43
>>857

アスキーコードでググれ
どのアルファベットがどの数字に割り当たってるのかわかるし
順番に並んでるのを見れば理解も早い

860:デフォルトの名無しさん
10/05/11 18:08:33
いろいろな操作を行って、例えばABCD\0が入っている文字配列Z[5]を
空にする(宣言直後の状態に戻す)方法はありますか?
例えばループ中で代入しようとするとエラーを吐いてしまいます。

まだかなり初心者だと思いますが、よろしくお願いします。

861:デフォルトの名無しさん
10/05/11 18:13:04
>>860
とりあえず、君が書いたコードを貼れよ

あと宣言直後は空でなく、デタラメな文字が入ってるよ。

862:デフォルトの名無しさん
10/05/11 18:28:58
>>860
memset( Z, 0x00, sizeof( Z ) );

863:デフォルトの名無しさん
10/05/11 18:29:58
>>860
for(i=0;i<=5;i++)としてないかな?
添え字は0から始まるので要素数5の場合は
for(i=0;i<5;i++)として0~4の範囲を指定せねばいかんよ。

初期化の方法は
Cならmemset
WinAPIならZeroMemory
C++ならstd::fill
使い回さずにその都度宣言した方がいいと思う


864:デフォルトの名無しさん
10/05/11 18:31:35
宣言直後に入っている文字列を別の配列にコピーしておいてあとでコピーしなおせばいいんじゃないの?何がしたいのか分からんが。

865:デフォルトの名無しさん
10/05/11 18:39:44
>>860
*z = '\0';

866:デフォルトの名無しさん
10/05/11 20:21:33
>>865
君は C プログラマには向いてないから
BASIC 等をやったほうが良いんじゃないかな。

867:デフォルトの名無しさん
10/05/11 20:57:13
>>866
なんだって

868:デフォルトの名無しさん
10/05/11 22:16:02
シューティングゲーム作ってるんですが、int型とdouble型では
どちらのほうが計算速度が速いですか?

869:デフォルトの名無しさん
10/05/11 22:17:23
double型。

870:デフォルトの名無しさん
10/05/11 22:21:20
>>869
ありがとう!

871:デフォルトの名無しさん
10/05/11 22:22:40
んなわけないだろ。

872:デフォルトの名無しさん
10/05/11 23:03:44
いやdouble型早いから

873:デフォルトの名無しさん
10/05/11 23:16:39
今時のCPUならほとんど変わらない、まぁ、実測が基本
intからdoubleとかdoubleからintへの変換が多くあると急激に遅くなる
がんばって、固定小数にしてもそれほど早くもならなかったので、浮動小数でいいやとなった
これ以上速くしようと思ったらアルゴリズム改良するかGPUに支援してもらうか、はぁ

874:デフォルトの名無しさん
10/05/11 23:44:15
VIA の CPU なら整数演算でないと激遅

875:デフォルトの名無しさん
10/05/11 23:48:05
浮動小数点型はCPUによって微妙に数値誤差の出方が変わるので
リプレイ機能と相性が悪い聞く事がある
同じIntel系同士でもそうなるのかは俺は知らない

876:デフォルトの名無しさん
10/05/11 23:49:50
使う命令を切り替える実装を使うな

877:デフォルトの名無しさん
10/05/11 23:56:58
アセンブラでCPUの拡張命令(SSEとか3D Now!!)を叩くしかない。

878:デフォルトの名無しさん
10/05/12 00:11:57
WINAPIのwsprintfでは実数が扱えなかったので、
sprintfを使いました。
そこからWINAPIのTextOut等で、ウィンドウに文字を表示したいのですが、
char *型からLPCWSTRへの変換が出来ないのでエラーになります。
何かいい方法ありませんか?



879:デフォルトの名無しさん
10/05/12 00:22:21
mbstowcsって言えばいいのかな?

880:デフォルトの名無しさん
10/05/12 00:41:05
>>858
char型って整数の範囲決まってませんでした?じゃぁnが大きいと
計算できないんじゃ?Aは65ってこと?
プログラムにはアルファベットとnを入力させるように作るのですか?・・
初心者に見せかけて相当理解力が弱いんで優しくしてください・・
まじわからんww

881:デフォルトの名無しさん
10/05/12 00:47:53
文字コードってのがあんだよ。
コンピューターは01しか理解できないから文字も01に変換して処理させてるわけ。

882:デフォルトの名無しさん
10/05/12 00:54:44
>>878
tchar.hをインクルードして_stprintf使え。
これでcharではなく、Windows APIのTCHARが使える(正確には、ちと違うが)。

883:デフォルトの名無しさん
10/05/12 00:55:21
>>878
TextOutA()

884:デフォルトの名無しさん
10/05/12 00:56:04
ASCIIコード表を見るといいと思うよ。

885:デフォルトの名無しさん
10/05/12 00:56:55
>>881
文字コードは01じゃないけどな。

886:デフォルトの名無しさん
10/05/12 01:00:07
2進数に直したら全部01だろ馬鹿か

887:デフォルトの名無しさん
10/05/12 01:00:51
直すからだろw

888:デフォルトの名無しさん
10/05/12 01:01:49
>>1
山手線符号化したら、全部駅名だろwwアホww

889:デフォルトの名無しさん
10/05/12 01:32:15
>>888
もしよろしければどこへの誤爆かおしえていただきたいのですがいかがですかね

890:デフォルトの名無しさん
10/05/12 01:41:51
>>882
TCHAR の意味解ってないだろ。

>>884
ASCII とは限らないだろ。

891:デフォルトの名無しさん
10/05/12 01:49:13
TCHAR?
ティーチャーって先生って意味ですよね。


892:デフォルトの名無しさん
10/05/12 07:40:39
>>880
文字コードの文字のところ一部抜粋。
#include <stdio.h>
int main(void)
{
int i;
for (i=61;i<123;i++)
{
printf("%c(%3d) ",i,i);
if((!(i%10))||(i==122))printf("\n");
}
return 0;
}

893:デフォルトの名無しさん
10/05/12 08:03:20
>>882
_stprintfから、swprintfの存在を知り、問題なく実数でも扱えて
処理できました。

ありがとう!

894:デフォルトの名無しさん
10/05/12 08:31:06
文字コード云々じゃなくてさ、問題の意味がわからないって質問だろ?
アルファベットにアルファベットを足すとか言ってるし、「整数 n」←このnをアルファベットだと思ってるんじゃないの?
入力されたアルファベットにnというアルファベットを足すってどういう意味って聞いてるんじゃないの?

895:デフォルトの名無しさん
10/05/12 08:58:14
初心者質問していい?

896:デフォルトの名無しさん
10/05/12 09:02:10
だめ

897:デフォルトの名無しさん
10/05/12 09:51:53
>>895
どうぞ。

>>894
>「整数 n」←このnをアルファベットだと思ってるんじゃないの?
その発想はなかったw

898:デフォルトの名無しさん
10/05/12 12:11:13
どうも元質問者は VBからの移行なのか variant型 が当然のようで

 変数 a に 文字の '1' を与える
 → 整数演算の時 値として 1 に評価される

という思考から抜け出せないでいるようだ


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch