C programming notes

 

c_programming

c_programming

1 introducing C

Macro
A macro is a fragment of code which has been given a name.
Compiler
a program that converts instructions into a machine-code or lower-level form so that they can be read and executed by a computer
Header
a collection of information that goes at the top of a file
Keywords
the words used to express a language, and you can't use them for other purposes.
stdio.h standard input/output header
// comment for c99
/* */ comment
; statement terminator (end of a statement)
EOF end of file
\n Gives vertical tab (It moves you to the next line).
\t Gives horizontal tab
array[ ] array
num =1 an assignment statement, assigns the value "1" to the variable called "num"
include <stdio.h> The effect of include <stdio.h> is the same as if you had typed the entire contents of the stdio.h file into your file
= assignment operator
%d specifies an integer argument

#comment

– Each statement must be terminated with a semicolon ';'

– All variables must be explicitly declared (unlike in FORTRAN)

Compound statements can be created by enclosing multiple statements by braces: { }

anatomy of a c program

  • Functions are made up of statements
  • Functions are the building blocks of C

structure_c_program.png

1.1 first code

#include <stdio.h> /* preprocessor statements, include another file*/
int main(void) /* a function named "main", "int" indicates that the "main" function returns an integer; the "void" indicates that main () doesn't take any arguments */
{
int num; /* define a variable called 'num' */
num = 1; /* assign a value to num */
printf("I am a simple "); /* use the printf() function */
printf("computer.\n"); /*The \n symbol means to start a new line*/
printf("My favorite number is %d because it is first.\n",num);
return 0;
}
#include<studio.h> include another file
int main(void) a function name
int num a declaration statement
   
  • int and void as part of the standard ISO/ANSI C way for defining main().
  • all C programs begin execution with main(), no matter where main() is located in the program files

>> int num # a declaration statement where, num is a variable, int proclaims 'num' as in integer

1.2 assignment

>> num=1;

1.3 function

a function consists of a header and a body

Header

  • includes preprocessor statements, such as #include, and the function name

Body

  • enclosed by {}

function_c.png

1.4 printf() Function

>> num=1;

>> printf("My favorite number is %d because it is first.\n", num);

%d a placeholder to show where the value of num is to be printed.
  • The % alerts the program that a variable is to be printed at that location, and the d tells it to print the variable as a decimal (base 10) integer.

1.5 return statement

>> return 0;

1.6 scanf() – keyboard input

a function which provides keyboard input

1.7 bug and debug

Bug
errors
Debugging
finding and fixing the error
Semantic errors
errors in meaning.

1.7.1 How to debugging

  • pretend you are the computer and to follow the program steps one by one
  • Use debugger
  • sprinkle extra printf() statements throughout to monitor the values of selected variables at key points in the program

3 Data type.

Built-in: int, float, double, char, enum

Ansys Fluent: real, cxboolean

int: integer number

long: integer number of increased range

float: floating point (real) number

double: double-precision floating point (real) number

char: single byte of memory, enough to hold a character

\n (newline)
\t (tab)
\v (vertical tab)
\f (new page)
\b (backspace)
\r (carriage return)
\n (newline)
typedef
enables you to create your own name for a type

int, char, float, short,long, double, real

3.1 float

%f floating point value
%.2f 2 digits after decimal, e.g. 71.12
   

the scheme used to store a floating-point number is different from the one used to store an integer.
A floating-point number = real number

Floating-point representation involves breaking up a number into a fractional part and an exponent part and storing the parts separately

3.2 Floating point vs double

The double and float types are very similar. The float type allows you to store single-precision floating point numbers, while the double keyword allows you to store double-precision floating point numbers https://en.wikibooks.org/wiki/C_Programming/Variables#The_double_type

3.3 int

int=integer

7 integer type
7.00 a floating-point type

3.4 real

real includes Float, double, and long double real is a typedef that switches between float for single-precision arithmetic, and double for double-precision arithmetic. Since the interpreter makes this assignment automatically, it is good programming practice to use the real typedef when declaring all float and double data type variables in your UDF

%f double

3.5 Array

int ar[10];  /* ar is an array of 10 integers */

3.6 Char

Char= Character

  • character includes letter and punctuation mark
  • character is stored as integer number in computer

storage size, 1 byte value range:-128 to 127 or 0 to 255 https://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output

4 operator

 

4.1 arithmetic operator

mathematical operations such as addition, subtraction and multiplication on numerical values (constants and variables).

For integer, division below 1 is discarded When integers are divided, the result of the / operator is the algebraic quotient with any fractional part discarded.

!= not equal
= assignment
== equal to
+ addition
- subtraction
* multiplication
/ division
% remainder after division
++n n=n+1
& and
EOF end of file
||
or

4.2 Logical Operators

&& and
\( \vert \vert \) logical OR, true only if either one operator is true

4.3 program structure

A C program basically consists of the following parts

  • Preprocessor Commands
  • Functions
  • Variables
  • Statements & Expressions
  • Comments

4.4 array

syntax: type arrayName [ arraySize ]; e.g. a 10-element array called "balance" of type double double balance[10];

5 basic syntax

  • case sensitive
  • all variables must be declared before they are used
  • Each statement must be terminated with a semicolon ";"
  • Comments can be inserted anywhere between * and *
  • All variables must be explicitly declared (unlike in FORTRAN)
  • Compound statements can be created by enclosing multiple

statements by braces: { }

  • Function definitions have the following format:
function-name(parameter-list)
{
function body
}

first.c

#include <stdio.h> /* preprocessor statements, include another file*/
int main(void) /* a function named "main", "int" indicates that the "main" function returns an integer; the "void" indicates that main () doesn't take any arguments */
{
int num; /* define a variable called 'num' */
num = 1; /* assign a value to num */
printf("I am a simple "); /* use the printf() function */
printf("computer.\n"); /*The \n symbol means to start a new line*/
printf("My favorite number is %d because it is first.\n",num);  
return 0;
}

5.1 Identifiers

An identifier is a name used to identify a variable, function, or any other user-defined item.

An identifier starts with a letter A to Z, a to z, or an underscore '' followed by zero or more letters, underscores, and digits (0 to 9).

C does not allow punctuation characters such as @, $, and % within identifiers. C is a case-sensitive programming language. Thus, Manpower and manpower are two different identifiers in C. Here are some examples of acceptable identifiers −

mohd zara abc movename a123 myname50 _temp j a23b9 retVal

5.2 keywords

Keywords

The following list shows the reserved words in C. These reserved words may not be used as constants or variables or any other identifier names.

auto else long switch break enum register typedef case extern return union char float short unsigned const for signed void continue goto sizeof volatile default if static while do int struct _Packed double

6 statements

Types of statements

  • Declaration: creates a name for a variable and identifies the type of data to be stored in the variable.
  • Assignment: assigns a value to a variable
  • Function
  • Control
  • Null

6.1 #define statement (macro definition)

Goal: replace Constants with Symbols

  • no ";" at the end of command

#define CNAME value #define IDENTIFIER replacement CNAME #name of constant, usually upper-case Macro definitions are not variables and cannot be changed by your program code like variables.

  • The most common use of the statement is to declare names for constant numbers
  • the preprocessor doesn't know C, it just works on text.

#define PI 3.141592 #define SECSPERMIN 60 #define MINSPERHOUR 60 #define HOURSPERDAY 24

7 loop

for, while, do while

8 Golssary

identifier
a name used to identify a variable, function, or any other user-defined item
array
a collection of variables of the same type.
Identifier
name of variable
macro
a fragment of code which has been given a name. Whenever the name is used, it is replaced by the contents of the macro.

8.1 macro

macro
a fragment of code which has been given a name. Whenever the name is used, it is replaced by the contents of the macro.

https://gcc.gnu.org/onlinedocs/cpp/Macros.html types of macros : object-like macros and function-like macros

8.2 Address

Reference to a memory location. In C pointers are used to hold addresses.

8.3 ANSI

American National Standards Institute

8.4 API

Application Programming Interface

8.5 Argument.

A value passed to a function (see parameter).

Base Class See C++ glossary.

Block. A sequence of definitions, declarations and statements, enclosed within braces {}.

Character Array. A set of elements of type char. (Can be used to store a string).

Class See C++ glossary.

Compilation error. Error which occurs during the translation of source code into machine code.

Compiler. A program which converts source code into machine code.

Compound Statement. A sequence of simple statements.

Constant (common all garden) An item that represents a value that cannot be changed. For Example:

123 'x'

Constant (symbolic) A symbol defined in a #define preprocessor directive to represent a constant value.

Declaration. A construct which associates attributes to a variable name or function. No storage is reserved.

For example:

extrn int a; extrn char c;

variable declaration

A structure decleration could look like:

struct perrec { int age; char *surname; char *firstname; };

Definition.

Variable definition is a declaration with storage allocation.

int a; char c; struct perrec person;

A construct which specifies the name,parameters and return type of a function. For example a function definition would be:

long sqr(int num) { return(num*num); }

Derived Class See C++ glossary.

Encapsulation. The C++ concept of grouping related variables and controlling the operations performed apon them. The encapsulated variables can be considered to be contained in their own environment.

Escape sequence. Control codes comprising combinations of a backslash followed by letters or digits which represent non printing characters.

Executable program. Program which will run in the environment of the operating system or within an appropriate run time environment.

Executable (stand-alone) program. Program which will run within the environment of the operating system without additional utilities or support.

Expression. A sequence of operators and operands which may yield a single value.

File. Data stored as an electronic file.

File descriptor. This is used in low level I/O (open/read/write/close functions) to identify a file. It is an integer number assigned to a file name by open and then used as a unique identifier by read/write and close.

Floating-point Number. Number having a decimal place or exponent.

Format specification. A string which controls how input or output shall be presented.

Identifier. The names used to refer to stored data values such as constants, variables or functions. Integer. A number without a fractional part.

Keyword. A word which has a predefined meaning to a 'C' compiler and therefore must not be used for any other purpose.

library file. The file which contains compiled versions of commonly used functions which can be linked to an object file to make an executable program.

Library function. A function whose code is contained in the external library file. Line. One line of input from the standard input device (keyboard) which is terminated with a newline character. The newline character is replaced by a null character.

Literal. Characters, letters or strings which are to be taken literally and used as constants rather than identifiers.

Method. C++ talk meaning a member function of a class.

Object See C++ glossary.

Object Code. Code which is directly understandable by the machine (machine code).

Operand. An expression acted on by an operator. For example:

z = a + b;

a and b are both operands of the + operator. Parameter. A value received by a function.

8.6 Pointer.

a Variable that contains an address in memory, not content, of another variable.

  • Pointers are declared using the * notation e.g.

int ip; / declares a pointer named "ip" that points to an integer variable*/

8.7 Polymorphism

See C++ glossary.

8.8 POSIX

Portable Operating System Interface.

8.9 Precedence (of operators)

The order in which operators are dealt with during the evaluation of an expression.

8.10 Preprocessor

A processor which manipulates the initial directives of the source file which contains instructions about how the source file shall be processed and compiled.

8.11 Preprocessor directive.

Source file instruction about how the file shall be processed and compiled.

8.12 Program.

A text file comprising code which can be compiled.

8.13 Run time error.

An error which occurs when a program is executed.

8.14 Reserved word. (keyword)

A word which has a predefined meaning to a 'C' compiler and therefore must not be used for any other purpose.

8.15 Scope.

8.16 Source code.

A text file comprising code which can be compiled.

8.17 Statement.

A simple statement is an expression followed by a semicolon. (See compound statement and block).

8.18 String.

A string in 'C' is an array of characters terminated by a Null character ('\0').

8.19 SubClass

See C++ glossary.

8.20 SuperClass

See C++ glossary.

8.21 Syntax error.

A mistake in the source code which prevents the compiler from converting it into object code.

8.22 Threads.

A process has five fundamental parts: code ("text"), data (VM), stack, file I/O, and signal tables. Theads are produced from a process and can share these parts to comunicate with each other.

The traditional method of spawning processes (fork) could only communicate with other forked processes via pipes and and "shared memory". The result is threads can communicate easily and have a low CPU overhead.

8.23 Variable.

An identifier (and storage) for a data type and for which the data value is allowed to change as the program runs.

8.24 pointer

Pointer
Variable containing an address.
Pointer
A pointer is a special kind of variable that contains an address in memory, not content, of another variable

int *ip # Pointers are declared using the * notation ; name of pointer: “ip”; integer variable

8.25 Escape sequence

\n - Gives vertical tab (It moves you to the next line). \t - Gives horizontal tab

9 Function

main (), printf()

pow(m,n) power function power (m, n) = mn
     

10 Input and Output

Goal: read and write files

fopen is a standard I/O function,

syntax:

FILE *fopen(char *filename, char *mode);

  • fopen opens a file in the mode that you specify.

e.g.

FILE *fp;     /* define a local pointer fp of type FILE */
fp = fopen("data.txt","r");  /* open a file named data.txt in read-only mode and assign it to fp */
fp=fopen("spanwise-force-report.txt", "w+");     /* write and update*/

mode

r read
w write
"w+" write/update: Create an empty file and open it for update (both for input and output). If a file with the same name already exists its contents are discarded and the file is treated as a new empty file.
a append
   

11 Tips on Making readable Programs

  • Choose meaningful variable names
  • use comments
  • using blank lines to separate one conceptual section of a function from another.
  • one line per statement

12 Tests

 

12.1 converts 2 fathoms to feet

fathmft.c #include <stdio.h> int main(void) { int feet, fathoms; fathoms = 2; feet = 6 * fathoms; printf("There are %d feet in %d fathoms!\n", feet, fathoms); printf("Yes, I said %d feet!\n", 6 * fathoms); return 0; }

#include <stdio.h> int main (void) { int toes; toes=10; twicetoes=2*toes; sqtoes=toes*toes; printf("toes is %d, and twice toes is %d, and toes squared is %d", toes, twicetoes, sqtoes); return 0;

}

12.2 convert your weight in rhodium

#include <stdio.h> int main(void) { float weight; * user weight * float value; * rhodium equivalent * printf("Are you worth your weight in rhodium?\n"); printf("Let's check it out.\n"); printf("Please enter your weight in pounds: "); * get input from the user * scanf("%f", &weight); To provide keyboard input to the program,The "%f" instructs scanf() to read a floating-point number from the keyboard, and the "&weight" tells scanf() to assign the input value to the variable named weight. * assume rhodium is $770 per ounce * * 14.5833 converts pounds avd. to ounces troy * value = 770.0 * weight * 14.5833; printf("Your weight in rhodium is worth $%.2f.\n", value); the %f specifier in the printf() code to handle a floating-point value. Use the .2 modifier to the %f specifier to fine-tune the appearance of the output so that it displays two places to the right of the decimal printf("You are easily worth that! If rhodium prices drop,\n"); printf("eat more to maintain your value.\n"); return 0; }

12.3 Scanning in numbers from a text file and finding the sum,largest number, and product

#include<stdio.h>

int main() { int a, sum = 0, numbers, m;

FILE *filein, *fileout; filein= fopen("numbers.txt", "r"); fileout = fopen("statistics.txt", "w");

//the sum part while(fscanf(filein, "%d", &a) == 1) { sum += a; } fprintf(fileout, "Sum = %d \n", sum);

//the max part while(fscanf(filein, "%d", &numbers) > 0) { if(numbers > m) m = numbers; } fprintf(fileout,"Largest = %d\n", m);

fclose(filein); return 0; }

13 References

  1. ANSYS Fluent Customization Manual (Appendix A. C Programming Basics)
  2. https://www.youtube.com/watch?v=aMpsKnf6DrQ&index=3&list=PL2_aWCzGMAwLSqGsERZGXGkA5AfMhcknE
  3. C Primer Plus– Stephen Prata
  4. http://open.163.com/movie/2008/1/T/V/M6SL23BRS_M6SL2QOTV.html
  5. https://www.zhihu.com/question/22524467
  6. K&C《THE C PROGRAMMING LANGUAGE》
  7. Practical C Programming, 3rd Edition by Steve Oualline
  8. C in a Nutshell, The Definitive Reference by Peter Prinz and Tony Crawford

the definitive C book guide

  • ANSYS Fluent Customization Manual (Appendix A. C Programming Basics)
  • Steve Oualline, Practical C Programming, 3rd Edition
  • Reference guide: C in a Nutshell, The Definitive Reference by Peter Prinz and Tony Crawford
  • B. Kernighan and D. Ritchie.

13.1 Beginner

C: How to Program (6th Edition) - Paul Deitel and Harvey M. Deitel.

Sams Teach Yourself C in 21 Days - Bradley L. Jones and Peter Aitken (2002).

C Primer Plus (5th Edition) - Stephen Prata (2004)

C Programming: A Modern Approach (2nd Edition) - K. N. King (2008).

A Book on C - Al Kelley/Ira Pohl

The C Book (Free Online) - Mike Banahan, Declan Brady, and Mark Doran

Practical C Programming (3rd Edition) - Steve Oualline (1997)

Head First C - David Griffiths and Dawn Griffiths

Beginning C (5th Edition) - Ivor Horton.

Applications Programming in ANSI C - Richard Johnsonbaugh and Martin Kalin (1996).

13.3 Intermediate

Object-oriented Programming with ANSI-C (Free PDF) - Axel-Tobias Schreiner

C Interfaces and Implementations - David R. Hanson. Provides information on how to define a boundary between an interface and implementation in C in a generic and reusable fashion. It also demonstrates this principle by applying it to the implementation of common mechanisms and data structures in C, such as lists, sets, exceptions, string manipulation, memory allocators, and more. Basically, Hanson took all the code he'd written as part of building Icon and lcc and pulled out the best bits in a form that other people could reuse for their own projects. It's a model of good C programming using modern design techniques (including Liskov's data abstraction), showing how to organize a big C project as a bunch of useful libraries.

The C Puzzle Book - Alan R. Feuer (1998)

The Standard C Library - P.J. Plauger (1992). It contains the complete source code to an implementation of the C89 standard library, along with extensive discussion about the design and why the code is designed as shown.

21st Century C: : C Tips from the New School - Ben Klemens (2012). In addition to the C language, the book explains gdb, valgrind, autotools, and git. The comments on style are found in the last part (Chapter 6 and beyond).

Algorithms in C - Robert Sedgewick. Gives you a real grasp of implementing algorithms in C. Very lucid and clear; will probably make you want to throw away all of your other algorithms books and keep this one.

Pointers on C - Kenneth Reek

Pointers in C - Naveen Toppo and Hrishikesh Dewan

Problem Solving and Program Design in C (6th Edition) - Jeri R. Hanly and Elliot B. Koffman (2009).

Data Structures - An Advanced Approach Using C - Jeffrey Esakov and Tom Weiss (1989).

C Unleashed - Richard Heathfield, Lawrence Kirby, et al. (2000). Not ideal, but it is worth intermediate programmers practicing problems written in this book. This is a good cookbook-like approach suggested by comp.lang.c contributors.

13.4 Expert

Expert C Programming: Deep C Secrets - Peter van der Linden (1994). Lots of interesting information and war stories from the Sun compiler team, but a little dated in places.

Advanced C Programming by Example - John W. Perry

Advanced Programming in the UNIX Environment - Richard W. Stevens and Stephen A. Rago (2013). Comprehensive description of how to use the Unix APIs from C code, but not so much about the mechanics of C coding.

Advanced C: Food for the Educated Palate - Narain Gehani (1985). Great on pointers, pointers to functions, and a variety of advanced topics, such as how stuff is stored in memory, dynamic memory, stack usage, function calling, parameter passing, etc. Assumes you have a good grasp of C to start with. Warning: pre-dates the ANSI standard and a lot of modern programming design.

Computer Programming: An Introduction for the Scientifically Inclined - Sander Stoks (2008). Great book about scientific use of programming languages.

Reversing: Secrets of Reverse Engineering - Eldad Eilam (2005). For those who want to test the limits of their ethics.

13.5 all levels

The C Programming Language (2nd Edition) - Brian W. Kernighan and Dennis M. Ritchie (1988). Still a good, short but complete introduction to C, written by the the inventor of C. However, the language has changed and good C style has developed in the last 25 years, and there are parts of the book that show its age.

C: A Reference Manual (5th Edition) - Samuel P. Harbison and Guy R. Steele (2002). An excellent reference book on C, up to and including C99. It is not a tutorial, and probably unfit for beginners. It's great if you need to write a compiler for C, as the authors had to do when they started.

C Pocket Reference (O'Reilly) - Peter Prinz and Ulla Kirch-Prinz

The comp.lang.c FAQ - Steve Summit. Web site with answers to many questions about C.

Various versions of the C language standards can be found here.

The new C standard - an annotated reference (Free PDF) - Derek M. Jones. The "new standard" referred to is the old C99 standard rather than C11.

Rationale for C99 Standard

13.6 Uncategorized

Essential C (Free PDF) - Nick Parlante. Note that this describes the C90 language at several points (e.g., in discussing // comments and placement of variable declarations at arbitrary points in the code), so it should be treated with some caution.

C Programming FAQs: Frequently Asked Questions - Steve Summit (1995).

C in a Nutshell - Peter Prinz and Tony Crawford (2005). Excellent book if you need a reference for C99.

Functional C - Pieter Hartel and Henk Muller (1997). Teaches modern practices that are invaluable for low-level programming, with concurrency and modularity in mind.

The Practice of Programming - Brian W. Kernighan and Rob Pike (1999). A very good book to accompany K&R.

C Traps and Pitfalls by A. Koenig (1989). Very good, but the C style pre-dates standard C, which makes it less recommendable these days.

Some have argued for the removal of 'Traps and Pitfalls' from this list because it has trapped some people into making mistakes; others continue to argue for its inclusion. Perhaps it should be regarded as an 'expert' book because it requires a moderately extensive knowledge of C to understand what's changed since it was published.

Computer Systems: A Programmer's Perspective (3rd Edition) - Randal E. Bryant and David R. O'Hallaron (2015). Explains the C language in a disjointed narrative style, like Pulp Fiction.

Abstraction and Specification in Program Development - Barbara Liskov and John V. Guttag (1986) (not the newer Java-based version by Liskov alone). This is an undergraduate text, with some ideas worth thinking about.

Composite/Structured Design - Glenford J. Myers (1978). This and other books from the late 1970s and early 1980s by Yourdon and Myers provide excellent insights on structured design.

Build Your Own Lisp. An enjoyable way to learn C.

MISRA-C - industry standard published and maintained by the Motor Industry Software Reliability Association. Covers C89 and C99.

Although this isn't a book as such, every experienced C programmer should read and implement as much of it as possible. MISRA-C was originally intended as guidelines for safety-critical applications in particular, but it applies to any area of application where stable, bug-free C code is desired (who doesn't want less bugs?). MISRA-C is becoming the de facto standard in the whole embedded industry and is getting increasingly popular even in other programming branches. There are (at least) three publications of the standard, one from 1998, one from 2004, and one from 2012, where the last is the currently active, relevant one. There is also a MISRA Compliance Guidelines document from 2016, and MISRA C:2012 Amendment 1 — Additional Security Guidelines for MISRA C:2012 (published in April 2016). Note that some of the strictures in the MISRA rules are not appropriate to every context. For example, directive 4.12 states "Dynamic memory allocation shall not be used". This may well be appropriate in the embedded systems for which the MISRA rules are designed; it is not appropriate everywhere. (Compilers, for instance, generally use dynamic memory allocation for things like symbol tables, and to do without dynamic memory allocation would be difficult, if not preposterous.)

Archived lists of ACCU-reviewed books on Beginner's C (116 titles) and Advanced C (76 titles). Most of these don't look to be on the main site anymore, and you can't browse that by subject anyway.

13.7 Warnings

Be wary of books written by Herbert Schildt. In particular, you should stay away from C: The Complete Reference, known in some circles as C: The Complete Nonsense.

Also be wary of the book "Let Us C" by Yashwant Kanetkar. It is a horribly outdated book that teaches Turbo C and has lot of obsolete, misleading and downright incorrect material.

Learn C The Hard Way - Zed Shaw. A critique of this book by Tim Hentenaar:

To summarize my views, which are laid out below, the author presents the material in a greatly oversimplified and misleading way, the whole corpus is a bundled mess, and some of the opinions and analyses he offers are just plain wrong. I've tried to view this book through the eyes of a novice, but unfortunately I am biased by years of experience writing code in C. It's obvious to me that either the author has a flawed understanding of C, or he's deliberately oversimplifying to the point where he's actually misleading the reader

"Learn C The Hard Way" is not a book that I could recommend to someone who is both learning to program and learning C. If you're already a competent programmer in some other related language, then it represents an interesting and unusual exposition on C, though I have reservations about parts of the book.

  • Jonathan Leffler

Author: kaiming

Created: 2019-07-13 Sat 17:11

Emacs 24.5.1 (Org mode 8.2.10)

Validate

posted @ 2021-06-01 10:45  kaiming_ai  阅读(65)  评论(0编辑  收藏  举报